Засекаем время в bat/cmd
При всех моих стараниях уйти от Windows везде и навсегда не получается. Есть компьютер на работе, компьютеры друзей, собственный нетбук, с которым неохота возиться настолько кардинально. При этом, ряд задач в принципе выполняется из командной строки проще и удобнее, чем «оконно-мышевым» способом. Особенно если это задачи из тех, что имеют прямое отношение к Linux, например, работа с утилитами из комплекта gnuwin32.
Запуская однажды уже упомянутую упаковку/распаковку при помощи windows-реализации tar, я захотел однажды засечь время. Ну, не секундомером же это делать… Сделал командный файл, в котором вывожу время, запускаю архиватор, снова вывожу время.
Получается ерунда. Команда time \t выдает время с точностью до минуты. Ладно, можно использовать переменную среды %time% :
Чуть получше, но все равно очень плохо. Во-первых, если архиватору добавить ключ -v, и он начнет выдавать в консоль имена архивируемых объектов, то время начала стремительно унесется за пределы экрана. Во-вторых, чтобы понять, сколько процесс занял времени, все равно придется считать, а компьютер на что?
Однако переменная %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, который принимает в качестве параметра пакуемую папку, засекает время и пишет его в консоль и в лог-файл:
Аналогичным образом написал почти то же для распаковки, поправив пару строчек.
Конечно, можно кое-что оптимизировать, например, все вычисления с константами сделать на калькуляторе (или в уме), преобразование времени в сотые доли секунды вынести в «функцию» и вызывать ее через call , но так удобочитаемее, а на скорость выполнения влияет мало. Еще можно вместо своры собак ( @ ) поставить один раз в начале файла @echo off , дело вкуса. И, конечно, можно повнимательнее относиться к регистру символов и писать либо везде прописными, либо везде строчными. Но, как уж получилось…
Возможности команд Windows (тяжелое наследие DOS), конечно, довольно ограничены, но даже с их помощью можно делать интересные и полезные штучки. Вот только иногда фиг догадаешься, описание какой команды для твоей цели нужно смотреть и где именно искать…
Запустить программу и подсчитать время ее выполнения
Есть ли способ запустить программу, ограничив время ее выполнения и потребность оперативной памяти?
Подскажите пожалуйста, есть ли способ из cmd запустить программу, при этом ограничив время.
Запустить PDF-файл во время выполнения программы
могу ли я как-то запустить PDF файл во время выполнения программы, если да, то как это сделать ?
Подсчитать время выполнения сортировки
Нужно посчитать за какой время выполнится стандартная сортировка и сортировка, написанная мной.
Подсчитать время выполнения программы
На компьютер клиента требуется переслать данные, которые должны быть отсортированы на его стороне.
А мне интересно, почему программа запускается в командной строке
Добавлено через 2 минуты
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
Как подсчитать время выполнения задачи?
У меня есть процедура ввода случайной послед-ти, процедура самой сортировки и процедура вывода.
Как запустить внешнюю программу и не ожидать ее выполнения?
Как запустить внешнюю программу и не ожидать ее выполнения? RunCommand ждет пока запущенное.
Возможность изменять программу во время выполнения.
И всем доброго времени суток. Есть «безумная идея», но необходини коллективная помощь, думаю.
Как закрыть программу во время выполнения цикла while
У меня возникла такая проблема, когда я пытаюсь закрыть программу во время выполнения while у меня.
Отслеживание времени выполнения команд с помощью утилиты time
В некоторых ситуациях нам нужно точно знать, сколько времени потребовалось для выполнения конкретной команды или сценария. Конечно, вы можете самостоятельно засечь время или использовать секундомер, чтобы узнать продолжительность обработки команды. К счастью, существует команда time, которая избавит вас от всех этих проблем.
Командная строка предлагает множество одноцелевых утилит, благодаря которым нет необходимости писать дополнительный код. Команда time – одна из таких команд. Важно помнить, что команда time никак не связана с командой date, которая выводит дату и время системы. Утилита time измеряет время выполнения программы или сценария и сообщает вам полученное значение.
В этом мануале вы узнаете, как использовать команду time и как читать ее выходные данные.
Примечание: Если не указано иное, примеры в этом руководстве выполняются в оболочке Bash в Linux.
1: Время выполнения команды
Чтобы рассчитать продолжительность выполнения команды, укажите в ней time в качестве префикса.
Метод выполнения time зависит от вашей операционной системы. В некоторых оболочках (bash и zsh, например) утилита time является встроенной командой; но также есть и отдельная команда GNU time – и ее аргументы отличаются от тех, что использует встроенная time.
Используйте следующую команду, чтобы посмотреть, как работает time в вашей системе:
Вы получите такой результат:
time is a shell keyword
time is /usr/bin/time
В этом случае есть и встроенная команда оболочки time, и версия time , установленная в каталог /usr/bin/time.
Если вы хотите использовать GNU-версию time, вы можете поставить перед ней обратный слеш:
Если вы этого не сделаете, оболочка будет использовать встроенную версию.
Примечание: Оболочка fish не имеет собственной реализации time. Если вы используете fish, вам нужно убедиться, что у вас установлена GNU команда time.
Оба метода служат одной и той же цели, хотя версия GNU имеет более продвинутые параметры форматирования.
Давайте исследуем время выполнения команды tree в корне вашей файловой системы. Эта команда отобразит визуальное дерево всех ваших файлов и каталогов.
Команда tree не всегда установлена по умолчанию, но в системах Ubuntu и Debian вы можете установить ее с помощью apt:
sudo apt install tree
В macOS ее можно установить с помощью Homebrew:
brew install tree
Теперь, когда команда tree установлена, используйте ее, чтобы просмотреть все файлы в системе, и добавьте к ней префикс time, чтобы узнать, сколько времени это займет:
Вы увидите, как прокручивается информация о файлах. В конце концов команда покажет вам потраченное время:
# Здесь будет вывод команды tree.
166590 directories, 1568127 files
tree / 12.24s user 10.37s system 66% cpu 33.827 total
Обратите внимание, что выполненная вами команда tree / повторяется командой time. Вывод отображает несколько фрагментов информации, но пока мы сосредоточимся на значении total:
tree / 12.24s user 10.37s system 66% cpu 33.827 total
Именно столько времени потребовалось для выполнения команды в секундах.
Команда time также работает, если вы отменили выполнение команды с помощью Ctrl+C. Если вы снова запустите time tree / и быстро нажмете Ctrl+C, вывод команды tree остановится, а на экране будут представлены результаты time за то время, что успела поработать команда до того, как вы ее остановили.
2: Использование ресурсов
Вывод time включает три значения в дополнение к общей продолжительности выполнения команды, total.
tree / 12.24s user 10.37s system 66% cpu 33.827 total
Первое значение – user. Это общее количество времени (в CPU-секундах), которое команда провела в пользовательском режиме.
Следующее значение, system – это количество времени (тоже в CPU-секундах), которое команда провела в режиме системы или ядра.
Наконец, cpu – это процент использования ЦП, выделенного команде.
Разница между пользовательским и системным временем заключается в использовании ЦП, которое разбивается по уровням доступа. Когда код выполняется в пользовательском режиме, он не имеет прямого доступа к оборудованию или памяти и должен полагаться на API системы. Так работает большая часть кода в вашей системе, благодаря такой его изоляции всегда можно исправить сбои.
В свою очередь, в режиме ядра исполняемый код имеет неограниченный доступ к системному оборудованию. Этот режим в значительной степени зарезервирован для наиболее надежных функций операционной системы. Когда какой-либо код сталкивается с ошибкой в режиме ядра, из-за полного доступа эти ошибки приводят к сильным сбоям и, как правило, приводят к сбою системы в целом.
Заключение
В этом мануале вы узнали, как при помощи команды time узнать, сколько времени потребовалось для выполнения команд и сценариев и на что именно потрачено это время. Команда time, встроенная в вашу оболочку, дает вам быстрый доступ к расчету продолжительности выполнения запущенных команд без каких-либо дополнительных средств.
Как измерить время выполнения команды в командной строке Windows?
Есть ли встроенный способ измерения времени выполнения команды в командной строке Windows?
Кроме того, Windows PowerShell имеет встроенную команду, которая похожа на команду Bash time. Он называется «Measure-Command». Вы должны убедиться, что PowerShell установлен на машине, которая ее запускает.
- Чтобы измерить время выполнения до сотой доли секунды в формате (hh: mm: ss.ff)
Чтобы не загружать и устанавливать пакет ресурсов
Чтобы выглядеть как огромный DOS-ботаник (кто этого не делает)
Попробуйте скопировать следующий script в новый пакетный файл (например, timecmd.bat):
Использование
Если вы поместите timecmd.bat в каталог на своем пути, вы можете вызвать его из любого места, как это:
Если вы хотите выполнить перенаправление вывода, вы можете процитировать команду следующим образом:
Это должно обрабатывать команды, которые запускаются от до — до полуночи, но вывод будет неправильным, если ваша команда работает 24 часа и более.
Хе-хе, самым простым решением может быть следующее:
Это работает на каждой Windows из коробки.
В случае приложения, использующего консольный вывод, было бы удобно хранить время начала во временной переменной:
Если вы используете Windows 2003 (обратите внимание, что Windows Server 2008 и более поздние версии не поддерживаются), вы можете использовать набор ресурсов Windows Server 2003 Resource Kit, который содержит timeit.exe, который отображает подробную статистику исполнения. Вот пример, с указанием команды «timeit -?»:
Вы можете получить TimeIt в наборе ресурсов Windows 2003. Загрузите его здесь.
Просто небольшое расширение ответа от Casey.K об использовании Measure-Command from PowerShell:
Вы можете вызвать PowerShell из стандартной командной строки, например:
Это будет стандартный вывод, но вы можете предотвратить это, добавив | Out-Default , как это из PowerShell:
Или из командной строки:
Конечно, вы можете обернуть это в файл script *.ps1 или *.bat .
Однострочный ящик, используемый в Windows Server 2008 R2:
До тех пор, пока mycommand не требует котировок (которые винты с обработкой кодов cmd). /v:on означает, что два разных значения TIME будут оцениваться независимо, а не один раз при выполнении команды.
Если у вас открыто командное окно и вызовите команды вручную, вы можете отобразить временную метку в каждом приглашении, например.
Это дает вам что-то вроде:
Если у вас есть небольшая партия script, которая выполняет ваши команды, перед каждой командой должна быть пустая строка, например
(следующая пустая строка)
Вы можете рассчитать время выполнения каждой команды по информации о времени в подсказке. Лучше всего, вероятно, было бы подключить вывод к текстовому файлу для дальнейшего анализа:
Так как другие рекомендуют устанавливать такие вещи, как freeware и PowerShell, вы также можете установить Cygwin, что даст вам доступ ко многим базовым Unix команды, такие как time:
Не уверен, сколько добавочных ресурсов Cygwin добавляет.
Не так элегантно, как некоторые функции в Unix, но создайте cmd файл, который выглядит так:
Это покажет время начала и остановки:
Я использую бесплатное программное обеспечение под названием «GS Timer».
Просто создайте пакетный файл следующим образом:
Если вам нужен набор раз, просто подключите вывод таймера /s в файл .txt.
Разрешение составляет 0,1 секунды.
Я использую Windows XP и по какой-то причине timeit.exe не работает для меня. Я нашел еще одну альтернативу — PTIME. Это работает очень хорошо.
Пока он длится не более 24 часов.
Там также TimeMem (март 2012):
Это утилита Windows, которая выполняет программу и отображает ее времени выполнения, использования памяти и статистики ввода-вывода. Это похоже на функциональность утилиты времени Unix.
Версия таймера Postfix:
таймаут 1 | TimeIt.cmd
Скопируйте и вставьте это в какой-нибудь редактор, например, Notepad ++ и сохраните его как TimeIt.cmd:
Это однострочный, который позволяет избежать отложенного расширения, что может нарушить определенные команды:
Результат выглядит примерно так:
Для долгосрочных тестов замените $T на $D, $T и %TIME% на %DATE%, %TIME% , чтобы включить дату.
Чтобы использовать это внутри командного файла, замените %Z на %%Z .
Update
Вот улучшенный однострочный (без отложенное расширение):
Результат выглядит примерно так:
Этот подход не включает в себя процесс запуска нового cmd в результате и не включает команды prompt .
Это комментарий/править для Люка Сэмпсона приятный timecmd.bat и ответьте на
По какой-то причине это дает мне результат всего целых секунд. что для меня бесполезно. Я имею в виду, что я запускаю timecmd pause, и это всегда приводит к 1,00 с, 2,00 с, 4,00 сек. даже 0.00 сек! Windows 7. — Камило Мартин Сен 25 ’13 в 16:00 «
В некоторых конфигурациях разделители могут отличаться. Следующие изменения должны охватывать, по крайней мере, большинство западных стран.
%time% миллисекунды работают над моей системой, добавив, что ‘,’
(* потому что сайт не разрешает анонимный комментарий и не сохраняет хороший идентификатор, хотя я всегда использую тот же гостевой адрес электронной почты, который в сочетании с ipv6 ip и отпечатком от браузера должен быть достаточно, чтобы однозначно идентифицировать без пароля)
В случае, если кто-то еще пришел сюда, чтобы найти ответ на этот вопрос, есть функция Windows API, называемая GetProcessTimes() . Это не похоже на слишком много работы, чтобы написать небольшую программу на языке C, которая запускает команду, выполняет этот вызов и возвращает время процесса.
Вот мой метод, без преобразования и без ms. Полезно определять длительность кодирования (ограниченное до 24 часов):
Следующий script использует только «cmd.exe» и выводит количество миллисекунд с момента создания конвейера до момента завершения процесса, предшествующего script. т.е. введите команду и переместите ее в script. Пример: «timeout 3 | runtime.cmd» должен давать что-то вроде «2990». Если вам нужен как выход во время выполнения, так и вывод stdin, перенаправление stdin перед каналом — ex: «dir/s 1 > temp.txt | runtime.cmd» выведет вывод команды «dir» в «temp.txt», и будет печатать время выполнения на консоли.
В каталоге, где находится ваша программа, введите notepad mytimer.bat , нажмите «да», чтобы создать новый файл.
Вставьте код ниже, заменив YourApp.exe на свою программу, а затем сохраните.
Введите mytimer.bat в командной строке и нажмите Enter.
Process Explorer покажет время ядра, время пользователя и время на стене (и много других вещей), если вы нажмете на перед тем, как он выйдет. Это не инструмент командной строки, но в любом случае он очень полезен.
Ответ driblio можно сделать немного короче (хотя и не очень читаемым)
Следующий script эмулирует * nix эпоху, но он локальный и региональный. Он должен обрабатывать случаи края календаря, включая високосные годы. Если Cygwin, значения эпохи можно сравнить, указав опцию Cygwin.
Я нахожусь в EST, и различие, как сообщается, составляет 4 часа, что относительно правильно. Есть несколько интересных решений для удаления TZ и региональных зависимостей, но ничего тривиального, что я заметил.
мой код дает вам время работы в миллисекундах, до 24 часов, оно нечувствительно к региону и учитывает отрицательные значения, если код работает до полуночи. он использует задержанное расширение и должен быть сохранен в файле cmd/bat.
перед вашим кодом:
после вашего кода:
если вы хотите время работы в формате HH: mm: ss.000, добавьте:
переменная t2 содержит ваше время выполнения, вы можете отобразить echo %t2% чтобы отобразить ее.
«Lean and Mean» TIMER с региональным форматом, 24h и поддержкой смешанного ввода
Адаптация тела метода замены Aacini, без IF’s, только один FOR (мое региональное исправление)
1: Файл timer.bat размещен где-то в% PATH% или текущем каталоге
Использование:
таймер и echo start_cmds и таймаут /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» no и cmd/v: on/c эхо до полуночи =! timer_end!
Ввод теперь может быть смешанным, для тех маловероятных, но возможных изменений формата времени во время выполнения
2: Функция : таймер в комплекте с пакетом script (пример использования ниже):
:: протестировать его, скопировать-вставить как выше, так и ниже секций кода
CE, DE и CS, DS означают конец дна, конец точки и набор двоеточия, набор точек — используется для поддержки смешанного формата