Время выполнения команды windows

Засекаем время в 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: при установленной в двойных кавычках пишем строку, в простых — команду. При снятой опции строку пишем в простых кавычках, а команду — в обратных (которые обычно на клавише с буквой Ё). При этом, команда вполне может быть одна, и проход цикла тоже один, и в теле цикла получаем нужный нам вывод команды, который засунем в переменную для дальнейшего использования (хотя можно и использовать сразу):

Читайте также:  Windows syswow64 config systemprofile desktop

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

Итого получаем такой командный файл, скажем, 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, чтобы узнать, сколько времени это займет:

Читайте также:  Aeroadmin для windows 10

Вы увидите, как прокручивается информация о файлах. В конце концов команда покажет вам потраченное время:

# Здесь будет вывод команды 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 файл, который выглядит так:

Читайте также:  Winio64 sys синий экран windows 10

Это покажет время начала и остановки:

Я использую бесплатное программное обеспечение под названием «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 означают конец дна, конец точки и набор двоеточия, набор точек — используется для поддержки смешанного формата

Оцените статью