Сколько времени пакетный файл берет для выполнения?

Измените это

t_x1=x1.view(10,30,1)

на

t_x1=x1.view(150,150,1)

и попробуйте

18
задан Peter Mortensen 18 June 2014 в 21:40
поделиться

4 ответа

Это своего рода тангенциальное, но может помочь вам.

У Microsoft есть программа timeit.exe, которая работает более или менее как расширенная версия команды unix 'time'. Он входит в состав Windows Server 2003 Resource Kit и заменяет его все время

4
ответ дан 30 November 2019 в 06:26
поделиться

В исходном пакетном файле выпрыгивают две вещи. , но ни один из них не поможет в долгосрочной перспективе.

  1. Каким бы ни был ваш метод тестирования, обязательно запишите время начала до операции и время окончания после операция. Ваш пример этого не делает.

  2. % time% оценивается как «12: 34: 56.78», и команда SET / A не может их вычесть. Вам нужна команда, которая производит простую скалярную метку времени.

Я собирался сказать, что это невозможно, но пакетный язык намного мощнее, чем его считают, поэтому вот простая реализация TIMER.BAT. Для протокола, Пакс избил меня ответом, показывающим, как струна раскалывается, пока я возился, и Йоханнес Рессел предложил перенести арифметику за пределы измеряемой области:

@echo off
setlocal

rem Remeber start time. Note that we don't look at the date, so this
rem calculation won't work right if the program run spans local midnight.
set t0=%time: =0%

rem do something here.... but probably with more care about quoting.
rem specifically, odd things will happen if any arguments contain 
rem precent signs or carets and there may be no way to prevent it.
%*

rem Capture the end time before doing anything else
set t=%time: =0%

rem make t0 into a scaler in 100ths of a second, being careful not 
rem to let SET/A misinterpret 08 and 09 as octal
set /a h=1%t0:~0,2%-100
set /a m=1%t0:~3,2%-100
set /a s=1%t0:~6,2%-100
set /a c=1%t0:~9,2%-100
set /a starttime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%

rem make t into a scaler in 100ths of a second
set /a h=1%t:~0,2%-100
set /a m=1%t:~3,2%-100
set /a s=1%t:~6,2%-100
set /a c=1%t:~9,2%-100
set /a endtime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%

rem runtime in 100ths is now just end - start
set /a runtime = %endtime% - %starttime%
set runtime = %s%.%c%

echo Started at %t0%
echo Ran for %runtime%0 ms

Вы могли бы упростить арифметику и быть немного более честным в отношении общей точности этого, не беспокоясь о сотых долях второй части. Вот он в действии, предполагая, что у вас есть команда режима сна или какая-то другая трата времени:

C:> TIMER SLEEP 3
Script took 3000 ms to complete
C:> 

Редактировать: Я пересмотрел код и его описание, как предлагается в комментарии.

Я думаю, что когда команда NT заменила COMMAND.COM с CMD.EXE, они думали, что не сделают это совсем иначе. Но на самом деле это почти совершенно новый язык. Многие из старых любимых команд имеют новые функции, если расширения включены.

Одной из них является SETLOCAL , которая не позволяет переменным изменять среду вызывающего. Другой - SET / A , который дает вам замечательную арифметику. Принцип, который я использовал здесь, - это новый синтаксис извлечения подстрок, где % t: ~ 3,2% означает два символа, начинающиеся со смещения 3 в значении переменной с именем t .

Для настоящего шокера взгляните на полное описание набора (попробуйте SET /? в приглашении) и, если вас это не пугает, посмотрите на FOR / ? и обратите внимание, что он может анализировать текст из файлов ...

Редактировать 2: Исправлена ​​неправильная обработка полей времени, содержащих 08 или 09 Фрэнки в комментариях. Подправил пару вещей и добавил несколько комментариев.

Обратите внимание, что здесь есть явный недосмотр, который я, вероятно, не собираюсь исправлять. Это победило не работает, если команда начинается в другой день, чем она заканчивается. То есть он будет выполнять некоторые математические операции, связанные со временем суток, и сообщать о разнице, но эта разница не будет много значить.

Исправить ее, чтобы хотя бы предупредить об этом случае, легко. Исправить это, чтобы сделать правильные вещи, труднее.

Редактировать 3: Исправлена ​​ошибка, когда% h% не был установлен правильно для однозначных часов. Это связано с тем, что% time% возвращает «9: 01: 23.45». Обратите внимание на пространство. Использование% time: = 0% заменяет пробел на начальный ноль, и% h% будет установлен правильно. Эта ошибка возникала только тогда, когда сценарий выполнялся от одного часа цифры к следующему.

Исправить это, чтобы сделать правильные вещи, труднее.

Редактировать 3: Исправлена ​​ошибка, когда% h% не был установлен правильно для однозначных часов. Это связано с тем, что% time% возвращает «9: 01: 23.45». Обратите внимание на пространство. Использование% time: = 0% заменяет пробел на начальный ноль, и% h% будет установлен правильно. Эта ошибка возникала только тогда, когда сценарий выполнялся от одного часа цифры к следующему.

Исправить это, чтобы сделать правильные вещи, труднее.

Редактировать 3: Исправлена ​​ошибка, когда% h% не был установлен правильно для однозначных часов. Это связано с тем, что% time% возвращает «9: 01: 23.45». Обратите внимание на пространство. Использование% time: = 0% заменяет пробел на начальный ноль, и% h% будет установлен правильно. Эта ошибка возникала только тогда, когда сценарий выполнялся от одного часа цифры к следующему.

38
ответ дан 30 November 2019 в 06:26
поделиться

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

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

@echo off
cls
REM ================================================== ======
REM = Setting Date Time Format =
REM ================================================== ======
set DT=%DATE% %TIME%
set year=%DT:~10,4%
set mth=%DT:~4,2%
set date=%DT:~7,2%
set hour=%DT:~15,2%
set min=%DT:~18,2%
set sec=%DT:~21,2%
set newDT=%year%_%mth%_%date% %hour%%min%%sec%

set hour=14
set min=10

REM ===============================
REM = Getting End Time =
REM ===============================
set EndTime=%TIME%
set EndHour=%EndTime:~0,2%
set EndMin=%EndTime:~3,2%


REM ===============================
REM = Finding Difference =
REM ===============================
set /a Hour_Diff=EndHour - hour >nul
set /a Min_Diff=EndMin - min >nul


REM ===============================
REM = Hour Hand Change? =
REM ===============================
IF [%Hour_Diff]==[0] (

Set Duration=%Min_Diff%
) ELSE (

Set /a Duration=60-%Min_Diff% >nul
)


echo Start Time = %hour% : %min%
echo End Time = %EndHour% : %EndMin%
echo.
echo Min Diff = %Min_Diff%
echo.
echo time difference (mins) = %Duration%

Я также предполагаю, что это опечатка, но вы обязательно должны установить endtime после обработки .

1
ответ дан 30 November 2019 в 06:26
поделиться

Мое личное предпочтение - установить Cygwin и использовать команду time , но, если вы на самом деле У есть , чтобы сделать это как командный файл, вы не можете просто вычесть строки, вы должны рассматривать их как части.

Следующий скрипт рассчитает 10-секундную команду ping с возможностью пересекать однодневную границу без привязки к отрицательным числам. Небольшое улучшение позволило бы ему пересечь многие дневные границы.

@echo off
setlocal enableextensions enabledelayedexpansion
set starttime=%time%
ping -n 11 127.0.0.1 >nul: 2>nul:
set endtime=%time%

set /a hrs=%endtime:~0,2%
set /a hrs=%hrs%-%starttime:~0,2%

set /a mins=%endtime:~3,2%
set /a mins=%mins%-%starttime:~3,2%

set /a secs=%endtime:~6,2%
set /a secs=%secs%-%starttime:~6,2%

if %secs% lss 0 (
    set /a secs=!secs!+60
    set /a mins=!mins!-1
)
if %mins% lss 0 (
    set /a mins=!mins!+60
    set /a hrs=!hrs!-1
)
if %hrs% lss 0 (
    set /a hrs=!hrs!+24
)
set /a tot=%secs%+%mins%*60+%hrs%*3600

echo End     = %endtime%
echo Start   = %starttime%
echo Hours   = %hrs%
echo Minutes = %mins%
echo Seconds = %secs%
echo Total   = %tot%

endlocal
2
ответ дан 30 November 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: