Как измерить время выполнения команды в командной строке Windows? - PullRequest
441 голосов
/ 23 марта 2009

Существует ли встроенный способ измерения времени выполнения команды в командной строке Windows?

Ответы [ 29 ]

13 голосов
/ 06 марта 2012

Я использую Windows XP и по какой-то причине timeit.exe у меня не работает. Я нашел другую альтернативу - PTIME. Это работает очень хорошо.

http://www.pc -tools.net / win32 / PTIME /

Пример -

C:\> ptime

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

Syntax: ptime command [arguments ...]

ptime will run the specified command and measure the execution time
(run time) in seconds, accurate to 5 millisecond or better. It is an
automatic process timer, or program timer.


C:\> ptime cd

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

===  cd ===
C:\

Execution time: 0.015 s
10 голосов
/ 10 марта 2011

Пока это не длится дольше 24 часов ...

@echo off

set starttime=%TIME%
set startcsec=%STARTTIME:~9,2%
set startsecs=%STARTTIME:~6,2%
set startmins=%STARTTIME:~3,2%
set starthour=%STARTTIME:~0,2%
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%)

:TimeThis
ping localhost 

set endtime=%time%
set endcsec=%endTIME:~9,2%
set endsecs=%endTIME:~6,2%
set endmins=%endTIME:~3,2%
set endhour=%endTIME:~0,2%
if %endhour% LSS %starthour% set /a endhour+=24
set /a endtime=(%endhour%*60*60*100)+(%endmins%*60*100)+(%endsecs%*100)+(%endcsec%)

set /a timetaken= ( %endtime% - %starttime% )
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%

echo.
echo Took: %timetaken% sec.
9 голосов
/ 21 января 2013

Также есть TimeMem (март 2012):

Это утилита Windows, которая выполняет программу и отображает ее время выполнения, использование памяти и статистика ввода-вывода. Это похоже на функциональность для утилиты времени Unix.

4 голосов
/ 02 сентября 2015

Это однострочник, который избегает отложенного расширения , что может помешать определенным командам:

cmd /E /C "prompt $T$$ & echo.%TIME%$ & COMMAND_TO_MEASURE & for %Z in (.) do rem/ "

Вывод выглядит примерно так:

14:30:27.58$
...
14:32:43.17$ rem/ 

Для долгосрочных тестов замените $T на $D, $T и %TIME% на %DATE%, %TIME%, чтобы включить дату.

Чтобы использовать это внутри пакетного файла , замените %Z на %%Z.


Обновление

Вот улучшенный однострочный (без задержка расширения тоже):

cmd /E /C "prompt $D, $T$$ & (for %# in (.) do rem/ ) & COMMAND_TO_MEASURE & for %# in (.) do prompt"

Вывод выглядит примерно так:

2015/09/01, 14:30:27.58$ rem/ 
...
2015/09/01, 14:32:43.17$ prompt

Этот подход не включает в себя процесс создания нового cmd в результате, а также не включает команду prompt.

3 голосов
/ 21 декабря 2015

Вот это

Версия таймера постфикса:

Пример использования:

тайм-аут 1 | TimeIt.cmd

Execution took  ~969 milliseconds.

Скопируйте и вставьте это в какой-нибудь редактор, например, Блокнот ++ и сохраните его как TimeIt.cmd :

:: --- TimeIt.cmd ----
    @echo off
    setlocal enabledelayedexpansion

    call :ShowHelp

    :: Set pipeline initialization time
    set t1=%time%

    :: Wait for stdin
    more

    :: Set time at which stdin was ready
    set t2=!time!


    :: Calculate difference
    Call :GetMSeconds Tms1 t1
    Call :GetMSeconds Tms2 t2

    set /a deltaMSecs=%Tms2%-%Tms1%
    echo Execution took ~ %deltaMSecs% milliseconds.

    endlocal
goto :eof

:GetMSeconds
    Call :Parse        TimeAsArgs %2
    Call :CalcMSeconds %1 %TimeAsArgs%

goto :eof

:CalcMSeconds
    set /a %1= (%2 * 3600*1000) + (%3 * 60*1000) + (%4 * 1000) + (%5)
goto :eof

:Parse

    :: Mask time like " 0:23:29,12"
    set %1=!%2: 0=0!

    :: Replace time separators with " "
    set %1=!%1::= !
    set %1=!%1:.= !
    set %1=!%1:,= !

    :: Delete leading zero - so it'll not parsed as octal later
    set %1=!%1: 0= !
goto :eof

:ShowHelp
    echo %~n0 V1.0 [Dez 2015]
    echo.
    echo Usage: ^<Command^> ^| %~nx0
    echo.
    echo Wait for pipe getting ready... :)
    echo  (Press Ctrl+Z ^<Enter^> to Cancel)
goto :eof

^ - Основано на версии «Даниэль Спаркс»

2 голосов
/ 21 сентября 2018

Альтернативой измерению времени является просто «Get-Date». У вас нет проблем с пересылкой и т. Д.

$start = Get-Date
[System.Threading.Thread]::Sleep(1500)
$(Get-Date) - $start

Выход:

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 1
Milliseconds      : 506
Ticks             : 15060003
TotalDays         : 1.74305590277778E-05
TotalHours        : 0.000418333416666667
TotalMinutes      : 0.025100005
TotalSeconds      : 1.5060003
TotalMilliseconds : 1506.0003
2 голосов
/ 20 февраля 2014

Это является комментарием / редактированием к милому Люку Сэмпсону timecmd.bat и ответом на

По какой-то причине это дает мне вывод только в целых секундах ... что для меня бесполезно. Я имею в виду, что я запускаю timecmd pause, и это всегда приводит к 1,00 с, 2,00 с, 4,00 с ... даже к 0,00 с! Windows 7. - Камило Мартин, 25 сентября 2013 г., 16:00 "

В некоторых конфигурациях разделители могут отличаться. Следующее изменение должно охватывать как минимум большинство западных стран.

set options="tokens=1-4 delims=:,." (added comma)

%time% миллисекунды работают в моей системе после добавления этого ','

(* потому что сайт не позволяет оставлять комментарии и не отслеживает личность, хотя я всегда использую один и тот же гостевой адрес электронной почты, который в сочетании с ipv6 ip и отпечатком браузера должен быть достаточным для однозначной идентификации без пароля)

2 голосов
/ 23 мая 2011

Если кто-то еще пришел сюда в поисках ответа на этот вопрос, есть функция Windows API под названием GetProcessTimes(). Не так уж много работы, чтобы написать небольшую C-программу, которая запустит команду, сделает этот вызов и вернет время процесса.

1 голос
/ 24 февраля 2019

В зависимости от используемой версии Windows, просто запуск bash переведет вас в режим Bash. Это позволит вам использовать несколько команд, которые не доступны непосредственно в PowerShell (например, команда time). Синхронизировать вашу команду теперь так же просто, как выполнить:

# The clause <your-command> (without the angle brackets) denotes the command you want to run.
$ time <your-command>

Примечание: Вы можете легко выйти из режима Bash и вернуться обратно в основную оболочку, запустив exit в режиме Bash.

Это отлично сработало для меня (Windows 10) после того, как мы попробовали другие методы (например, Measure-Command), которые иногда приводят к нежелательной статистике. Надеюсь, что это работает и для вас.

1 голос
/ 01 августа 2018

мой код дает вам время выполнения в миллисекундах, до 24 часов, он не зависит от локали и учитывает отрицательные значения, если код выполняется до полуночи. он использует отложенное расширение и должен быть сохранен в файле cmd / bat.

перед вашим кодом:

SETLOCAL EnableDelayedExpansion

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set t=%%I
set /a t1 = %t:~8,1%*36000 + %t:~9,1%*3600 + %t:~10,1%*600 + %t:~11,1%*60 + %t:~12,1%*10 + %t:~13,1% && set t1=!t1!%t:~15,3%

после вашего кода:

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set t=%%I
set /a t2 = %t:~8,1%*36000 + %t:~9,1%*3600 + %t:~10,1%*600 + %t:~11,1%*60 + %t:~12,1%*10 + %t:~13,1% && set t2=!t2!%t:~15,3%
set /a t2-=t1 && if !t2! lss 0 set /a t2+=24*3600000

если вы хотите работать в формате ЧЧ: мм: сс.000, добавьте:

set /a "h=t2/3600000,t2%%=3600000,m=t2/60000,t2%%=60000" && set t2=00000!t2!&& set t2=!t2:~-5!
if %h% leq 9 (set h=0%h%) && if %m% leq 9 (set m=0%m%)
set t2=%h%:%m%:%t2:~0,2%.%t2:~2,3%

ENDLOCAL

переменная t2 содержит ваше время бега, вы можете echo %t2% отобразить его.

...