bat время выполнения скрипта
CMD/BAT: BenchMark времени выполнения
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Сообщения 3
1 Тема от Аскет 2012-12-31 01:27:24 (изменено: Аскет, 2012-12-31 01:53:22)
Тема: CMD/BAT: BenchMark времени выполнения
Ёу-хоу-хоу, а вот и дед Мороз с подарками
Вот и подошла к концу астрологическая эра Рыб, а вместе с ней и «Ночь Сварога», с сопутствующим ей «ментальным сном». Давайте ворвёмся в Чертог Волка с радостным настроением. В путь товар’ищи.
С наступающим 2013!
Представляю вашему вниманию уникальную разработку. Это преполезнейший отладочный скрипт!
Он может быть использован как при разработке/доводке/отладке/выборе алгоритма (поиске оптимального пути), так и при повседневном использовании.
Суть такова: у нас есть некое действо, которое надо выполнить, и затем показать сколько это действо затратило времени (а потом сравнить с подобным и выбрать самое быстрое, например)
«Действо» задаётся параметром запуска скрипта: команда, последовательность команд (через & и Ко.), программа или скрипт.
spendRunTimer.bat команда_скрипт_или_программа [параметы]
spendRunTimer COMMAND ^^^>NUL
spendRunTimer.bat:
Засекаем время в bat/cmd
При всех моих стараниях уйти от Windows везде и навсегда не получается. Есть компьютер на работе, компьютеры друзей, собственный нетбук, с которым неохота возиться настолько кардинально. При этом, ряд задач в принципе выполняется из командной строки проще и удобнее, чем «оконно-мышевым» способом. Особенно если это задачи из тех, что имеют прямое отношение к Linux, например, работа с утилитами из комплекта gnuwin32.
Запуская однажды уже упомянутую упаковку/распаковку при помощи windows-реализации tar, я захотел однажды засечь время. Ну, не секундомером же это делать… Сделал командный файл, в котором вывожу время, запускаю архиватор, снова вывожу время.
Получается ерунда. Команда time \t выдает время с точностью до минуты. Ладно, можно использовать переменную среды %time% :
Однако переменная %time% хитроформатированная, скорее текст, чем число, и ее в лоб не получится использовать для вычитания времени начала из времени окончания. Тем более, командный интерпретатор cmd.exe работает с целочисленными значениями, а время идет с точностью до сотых секунды (ну, или до десятков миллисекунд, как хотите).
Ладно, разберем время на составляющие. При помощи конструкции set t1_m=%t1:
3,2% которая присваивает переменной t1_m два знака из t1, пропустив первые три, получим часы, минуты, секунды и сотые доли секунды:
Напоминаю, что ключик /a позволяет оператору set не только присваивать значение переменной, но и выполнять некоторые операции (подробнее — set /? ).
В результате получили в s1 время в сотнях миллисекунд, допустим, из времени начала операции. Можно сделать аналогичным образом s2 из времени окончания. Эти две переменные целочисленные и прекрасно складываются, вычитаются и все такое. Нам надо разность, и, чтобы избежать неожиданностей со знаками, можно сразу определить, что из них больше, и потом вычитать:
Ключик /i расширяет возможности оператора сравнения, позволяя ему не только выполнять сравнение строк на тождественность (чем он занимался изначально), но и сравнивать числа на больше/меньше/равно ( if /? )
Получили s3 — разность времени в десятках миллисекунд. Надо разобрать на составляющие, а потом склеить обратно в удобочитаемом виде. Все несложно, используем остаток от деления, чтобы избавиться, например, от часов при извлечении минут, и деление (целочисленное, другого тут нет), чтобы избавиться от секунд, примерно так:
Тут надо не забыть забавную тонкость: в командном интерпретаторе символ процента — подводный камень. Иногда он ставится по обе стороны от переменной, и тогда при выполнении интерпретатор отбрасывает эту пару, а имя переменной заменяет значением. Иногда он стоит перед переменной цикла. Иногда он используется в виде оператора получения остатка от целочисленного деления. Так вот, там, где процент непарный, его надо не забывать удваивать, а то его отбросят и будут безуспешно искать пару.
Получили часы, минуты, секунды и десятки миллисекунд в отдельных переменных. Можно их использовать, как числа, а можно — как строки, поэтому их легко склеить в одно значение времени и выдать его в стандартный поток ввода-вывода, «на консоль»:
Все это можно засунуть в отдельный файл, чтобы использовать в разных местах. Тогда время надо будет передавать файлу в виде параметров. Тут есть два варианта: либо
и передавать параметры в двойных кавычках (а тильда раскроет кавычки), либо
Итого, получился такой командный файл, скажем, timecalc.bat:
Теперь об использовании. Допустим, есть такой батничек, запускающий архивацию с засечкой времени:
В переменных a и b имеем время начала и окончания операции соответственно. Можно передать их нашему скрипту, непременно валяющемуся тут же рядом, в этой же папке:
И он выведет в консоль затраченное время третьей строчкой, после «start » и «stop ». Но хотелось бы добавить, допустим, «упаковано за » или «распаковано за », так что ввести соответствующие строки в файл «подпрограммы» не получится. Передавать этот строковый «довесок» в виде еще одного параметра и не особо красиво, и при желании дописать текст после времени (а не перед) опять потребует лезть в вызываемый файл. А как перехватить вывод вызываемого файла для использования в вызывающем?
Я просто обалдел, когда узнал. Внезапно, при помощи оператора цикла. О, сколько нам открытий чудных готовит for /? …
Расширение синтаксиса /F позволяет выковыривать переменную цикла из разного рода наборов: файлов, символьных строк, команд. Чтобы понять, что используется для цикла, применяются (или не применяются) кавычки. Без кавычек в скобках пишем файл или набор файлов. А применение кавычек зависит от того, установлена или нет опция usebackq: при установленной в двойных кавычках пишем строку, в простых — команду. При снятой опции строку пишем в простых кавычках, а команду — в обратных (которые обычно на клавише с буквой Ё). При этом, команда вполне может быть одна, и проход цикла тоже один, и в теле цикла получаем нужный нам вывод команды, который засунем в переменную для дальнейшего использования (хотя можно и использовать сразу):
И, кстати, не забываем, что переменная цикла должна быть односимвольной. Нигде этого не прочитал, вывел экспериментально путем ошибок и проб. Может, читал невнимательно, а может, не знал где…
Итого получаем такой командный файл, скажем, tar_time.cmd, который принимает в качестве параметра пакуемую папку, засекает время и пишет его в консоль и в лог-файл:
Аналогичным образом написал почти то же для распаковки, поправив пару строчек.
Возможности команд Windows (тяжелое наследие DOS), конечно, довольно ограничены, но даже с их помощью можно делать интересные и полезные штучки. Вот только иногда фиг догадаешься, описание какой команды для твоей цели нужно смотреть и где именно искать…
Как измерить время выполнения команды в командной строке Windows?
Существует ли встроенный способ измерения времени выполнения команды в командной строке Windows?
В качестве альтернативы, в Windows PowerShell есть встроенная команда, которая похожа на команду времени Bash. Это называется «Мера-Команда». Вы должны убедиться, что PowerShell установлен на компьютере, на котором он запущен.
Попробуйте скопировать следующий скрипт в новый пакетный файл (например, timecmd.bat ):
Применение
Если вы поместите timecmd.bat в каталог вашего пути, вы можете вызвать его из любого места, например:
Если вы хотите сделать перенаправление вывода, вы можете заключить команду в кавычки так:
Хе-хе, самое простое решение может быть таким:
Это работает на каждой Windows из коробки.
В случае приложения, использующего вывод консоли, может быть удобно сохранить время запуска во временной переменной:
Просто немного расширения ответа от Casey.K об использовании Measure-Command с помощью PowerShell :
Вы можете вызвать PowerShell из стандартной командной строки, например:
Это будет использовать стандартный вывод, но вы можете предотвратить это, добавив | Out-Default вот что из PowerShell:
Или из командной строки:
Однострочник, который я использую в Windows Server 2008 R2:
До тех пор, пока mycommand не требует кавычек (какие винты с обработкой кавычек cmd). Это /v:on делается для того, чтобы два разных значения ВРЕМЕНИ оценивались независимо, а не один раз при выполнении команды.
Если у вас открыто окно команд и вы вызываете команды вручную, вы можете отображать временную метку в каждом приглашении, например
Это дает вам что-то вроде:
Если у вас есть небольшой пакетный скрипт, который выполняет ваши команды, перед каждой командой должна быть пустая строка, например
(следующая пустая строка)
Вы можете рассчитать время выполнения каждой команды по информации о времени в приглашении. Лучше всего было бы направить вывод в текстовый файл для дальнейшего анализа:
Не уверен, сколько накладных расходов добавляет Cygwin.
Не так элегантно, как некоторые функции Unix, но создайте cmd-файл, который выглядит следующим образом:
Это будет отображать время начала и окончания примерно так:
Я использую бесплатное программное обеспечение под названием «GS Timer».
Просто создайте командный файл так:
Разрешение составляет 0,1 секунды.
Также есть TimeMem (март 2012):
Это утилита Windows, которая выполняет программу и отображает время ее выполнения, использование памяти и статистику ввода-вывода. По функциональности он похож на утилиту времени Unix.
Постфиксная версия таймера:
тайм-аут 1 | TimeIt.cmd
Скопируйте и вставьте это в какой-нибудь редактор, например Notepad ++, и сохраните его как TimeIt.cmd :
Альтернативой измерению времени является просто «Get-Date». У вас нет проблем с пересылкой вывода и так далее.
Обновить
Вот улучшенный однострочный (без отложенного расширения тоже):
Вывод выглядит примерно так:
Этот подход не включает процесс создания нового cmd в результате, и при этом он не включает prompt команду (ы).
В зависимости от версии Windows, которую вы используете, просто запуск bash переведет вас в режим Bash. Это позволит вам использовать несколько команд, которые не доступны непосредственно в PowerShell (например, time команда). Синхронизировать вашу команду теперь так же просто, как выполнить:
Примечание. Вы можете легко выйти из режима Bash и вернуться обратно в основную оболочку, запустившись exit в режиме Bash.
Это отлично сработало для меня (Windows 10) после опробования других методов (например Measure-Command ), которые иногда приводят к нежелательной статистике. Надеюсь, это работает и для вас.
Это комментарий / правка Люка Сэмпсона, хороший timecmd.bat и ответ на
В некоторых конфигурациях разделители могут отличаться. Следующее изменение должно охватывать как минимум большинство западных стран.
(* потому что сайт не позволяет оставлять комментарии и не отслеживает личность, хотя я всегда использую один и тот же гостевой адрес электронной почты, который в сочетании с ipv6 ip и отпечатком браузера браузера должен быть достаточным для однозначной идентификации без пароля)
Вот мой метод, без преобразования и без мс. Полезно определить длительность кодирования (хотя и ограниченную 24 часами):
Ответ дриблио можно сделать немного короче (хотя и не очень читабельным)
По замечанию Люка Сэмпсона, эта версия восьмерично безопасна, хотя задача должна быть выполнена за 24 часа.
В каталоге, где находится ваша программа, введите notepad mytimer.bat «Да», чтобы создать новый файл.
Вставьте приведенный ниже код, заменив его YourApp.exe своей программой, затем сохраните.
Введите mytimer.bat в командной строке и нажмите Enter.
Мой код дает вам время выполнения в миллисекундах, до 24 часов, он не зависит от локали и учитывает отрицательные значения, если код выполняется до полуночи. он использует отложенное расширение и должен быть сохранен в файле cmd / bat.
перед вашим кодом:
после вашего кода:
если вы хотите время выполнения в формате ЧЧ: мм: сс.000, добавьте:
переменная t2 содержит ваше время выполнения, вы можете echo %t2% отобразить его.
После того, как Perl установит доступное решение по найму, запустите:
STDERR предшествует измеренным секундам
Использование подпрограммы для возврата времени в сотых долях секунды
1: файл timer.bat находится где-то в% PATH% или текущем каталоге
Использование:
таймер и эхо start_cmds & timeout / t 3 и эхо end_cmds и таймер
таймер и таймер «23: 23: 23,00»
таймер «23: 23: 23,00» и таймер
таймера «13.23.23,00» и таймер «03: 03: 03.00«
таймер и таймер »0: 00: 00.00« нет & cmd / v: вкл / с эхо до полуночи =! Timer_end!
Ввод теперь может быть смешанным, для тех маловероятных, но возможных изменений формата времени во время выполнения
2: Функция : таймер в комплекте с пакетным скриптом (пример использования ниже):
:: чтобы проверить это, скопируйте и вставьте выше и ниже разделы кода
Я нахожусь в EST, и сообщаемая разница составляет 4 часа, что является относительно правильным. Есть несколько интересных решений по удалению TZ и региональных зависимостей, но я не заметил ничего тривиального.
Решение с использованием чистого PHP для cmd и одного env. переменная:
нет необходимости в cygwin или ненадежных утилитах. Полезно, когда PHP доступен локально
Точность и формат вывода можно легко настроить
Как измерить время выполнения команды в командной строке Windows?
есть ли встроенный способ для измерения времени выполнения команды в командной строке Windows?
29 ответов
вы можете получить TimeIt в наборе ресурсов Windows 2003. Загрузить его здесь.
кроме того, Windows PowerShell имеет встроенную команду, аналогичную команде Bash «time». Это называется «мера-команда».»Вы должны убедиться, что PowerShell установлен на машине, которая его запускает.
попробуйте скопировать этот скрипт в новый пакетный файл (например,timecmd.летучая мышь!—16—>):
использование
если вы ставите timecmd.bat в каталоге на вашем пути, вы можете позвонить из любого места, как это:
если вы хотите сделать перенаправление вывода, вы можете процитировать команду:
это должно обрабатывать команды, которые выполняются до и после полуночи, но вывод будет неправильным, если ваша команда работает в течение 24 часов или более.
Хе-Хе, самым простым решением может быть следующее:
это работает на всех Windows из коробки.
в случае приложения, использующего вывод консоли, может быть удобно хранить время запуска во временной переменной:
вы можете вызвать PowerShell из стандартной командной строки, например:
это съест стандартный вывод, но вы можете предотвратить это, добавив | Out-Default как это из PowerShell:
или из командной подсказка:
однострочный я использую в Windows Server 2008 R2:
пока mycommand не требует кавычек (которые винтами с обработкой кавычек cmd). The /v:on позволяет независимо оценивать два разных значения времени, а не один раз при выполнении команды.
если у вас открыто окно команд и вы вызываете команды вручную, вы можете отобразить метку времени в каждом приглашении, например
это дает вам что-то вроде:
если у вас есть небольшой пакетный скрипт, который выполняет ваши команды, перед каждой командой есть пустая строка, например
вы можете рассчитать время выполнения для каждой команды к информации о времени в приглашении. Лучше всего, вероятно, передать вывод в текстовый файл для дальнейшего анализа:
поскольку другие рекомендуют устанавливать такие вещи, как freeware и PowerShell, вы также можете установить Cygwin, что даст вам доступ ко многим основным командам Unix, таким как времени:
Не уверен, сколько накладных расходов добавляет Cygwin.
не так элегантно, как некоторые функции в Unix, но создайте файл cmd, который выглядит так:
это отобразит время начала и остановки, например:
Я использую бесплатное ПО под названием «GS Timer».
просто сделайте пакетный файл следующим образом:
Если вам нужен набор времен, то как раз труба выход таймера /с в А.txt-файл.
разрешение 0,1 секунды.
Я использую Windows XP и по какой-то причине timeit.exe не работает для меня. Я нашел другую альтернативу-PTIME. Это работает очень хорошо.
покуда оно не продолжает более длиной чем 24hours.
это утилита Windows, которая выполняет программу и отображает ее время выполнения, использование памяти и статистика ввода-вывода. Это похоже на функциональность утилиты времени Unix.
это ОДН-вкладыш который избегает отложенная экспансия, что может нарушить определенные команды:
обновление
здесь улучшена одну строчку (без отложенная экспансия тоже):
вывод выглядит примерно так:
этот подход не включает в себя процесс создания новой cmd в результате, и не включает в себя (ы).
версия таймера Postfix:
тайм-аут 1 / TimeIt.cmd
скопируйте и вставьте это в какой-нибудь редактор, например Блокнот++ и сохраните его как TimeIt.cmd:
этой Это комментарий / редактирование к люку Сэмпсону nice timecmd.bat и ответ
в некоторых конфигурациях разделители могут отличаться. Следующее изменение должно охватывать по крайней мере большинство западных страны.
на %time% миллисекунды работают на моей системе после добавления этого ‘,’
(*потому что сайт не позволяет комментировать anon и не отслеживает личность, хотя я всегда использую ту же гостевую электронную почту, которая в сочетании с IPv6 ip и отпечатком браузера должна быть достаточно, чтобы однозначно идентифицировать без пароля)
ответ driblio можно сделать немного короче (хотя и не очень читабельный)
до Примечание Люка Сэмпсона эта версия восьмерично безопасна, хотя задача должна быть завершена в течение 24 часов.
мой код дает вам время работы в миллисекундах, до 24 часов, он нечувствителен к локали и учитывает отрицательные значения, если код работает до полуночи. он использует отложенное расширение и должен быть сохранен в файле cmd/bat.
перед вашим кодом:
после того, как ваш код:
если вы хотите время работы в ЧЧ: мм: СС.Формат 000, добавить:
использование sub для возврата времени в сотых долях секунды
таймер»Lean and Mean» с региональным форматом, 24h и поддержкой смешанного ввода
Адаптация Aacini это тело метода замены, нет если, только один для (моего регионального исправления)
1: файл таймер.летучая мышь!—5—> помещено где-то в %PATH% или текущий dir
использование:
таймер & echo start_cmds & timeout /t 3 & echo end_cmds& таймер
таймер & таймер «23:23:23,00»
таймер «23:23:23,00» & таймер
таймер «13.23.23,00» & таймер «03:03:03.00»
таймер & таймер «0:00:00.00» нет & cmd/v: on / c echo до полуночи=!timer_end!
ввод теперь может быть смешан, для тех маловероятных, но возможных изменений формата времени во время выполнения
2: Функция :таймер в комплекте с пакетом скрипт (пример использования ниже):
::чтобы проверить его, скопируйте-вставьте как выше, так и ниже разделов кода
CE, DE и CS, DS стоят для конца двоеточия, конца точки и набора двоеточия, набора точки-используется для поддержки смешанного формата
в каталоге, где находится ваша программа, введите notepad mytimer.bat нажмите кнопку «Да», чтобы создать новый файл.
вставьте код ниже, заменив YourApp.exe С вашей программой, затем сохранить.
тип mytimer.bat в командной строке нажмите клавишу Ввод.
Процесс Explorer покажет время ядра, время пользователя и время стены (и многое другое), пока вы нажимаете на процесс до его выхода. Это не инструмент командной строки, но он очень полезен в любом случае.
для хорошего сценария Люка Сэмпсона исправления отрицательных значений должны быть сделаны в обратном порядке, так как они могут сделать ранее 0 значение отрицательным.
следующий скрипт эмулирует *Nix epoch time, но он является локальным и региональным. Он должен обрабатывать случаи края календаря, включая високосные годы. Если Cygwin доступно, значения эпохи можно сравнить, указав Cygwin.
Я нахожусь в EST, и разница составляет 4 часа, что относительно правильно. Есть несколько интересных решений для удаления TZ и региональных зависимостей, но ничего тривиального я не заметил.
вот мой метод, нет преобразования и нет ms. Полезно определить длительность кодирования (ограниченную 24 часами):
альтернативой измерению времени является просто «Get-Date». У вас нет этой проблемы с пересылкой вывода и так далее.
Запустить программу и подсчитать время ее выполнения
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Есть ли способ запустить программу, ограничив время ее выполнения и потребность оперативной памяти?
Подскажите пожалуйста, есть ли способ из cmd запустить программу, при этом ограничив время.
Подсчитать время выполнения сортировки
Нужно посчитать за какой время выполнится стандартная сортировка и сортировка, написанная мной.
Подсчитать время выполнения программы
На компьютер клиента требуется переслать данные, которые должны быть отсортированы на его стороне.
А мне интересно, почему программа запускается в командной строке
Добавлено через 2 минуты
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Как подсчитать время выполнения задачи?
У меня есть процедура ввода случайной послед-ти, процедура самой сортировки и процедура вывода.
Как запустить внешнюю программу и не ожидать ее выполнения?
Как запустить внешнюю программу и не ожидать ее выполнения? RunCommand ждет пока запущенное.
Возможность изменять программу во время выполнения.
И всем доброго времени суток. Есть «безумная идея», но необходини коллективная помощь, думаю.
Как закрыть программу во время выполнения цикла while
У меня возникла такая проблема, когда я пытаюсь закрыть программу во время выполнения while у меня.