Как измерить время выполнения программы в миллисекундах ?
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 156 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Как измерить время выполнения программы в миллисекундах ?
Название |
---|
Например, так:
Выведет время программы в секундах, с дробной частью. Обычно CLOCKS_PER_SEC=1000, поэтому можно и в целых числах.
Не очень точно, потому что clock() возвращает астрономическое время. При тестировании используется процессорное, а его изнутри программы я не знаю, как считать.
Да, конечно. Я не думаю, что надо точно. Ну, под виндой можно сделать GetCurrentProcess() и вперёд с песней.
под линухой можно запускать через time :)
А разве clock() везде возвращает астрономическое время?
В linux, например, $man 3p clock говорит:
Я не понял последнего утверждения. Как связаны целые числа и то, чему равно CLOCKS_PER_SEC?
Да и вообще говоря:
...
CONFORMING TO
C89, C99, POSIX.1-2001. POSIX requires that CLOCKS_PER_SEC equals
1000000 independent of the actual resolution.
offtop: пока отформатировал этот несчастный вывод чуть не помер. Что я делаю не так? В пяти тильдах не форматируется, пришлось руками, через html-код всё выравнивать. ...
Просили время в миллисекундах. Чтобы не домножать дабл на 1000 и творить чудеса, можно сделать всё в целых.
man/POSIX под Windows? Не, не слышал :) В MinGW 4.6.1 равен 1000.
Похоже я невнимательно читаю: где-то пропустил, что речь о windows-specific ситуации?
Копай чуть глубже :)
Мне есть, чему у вас поучиться, Холмс! :-)
ну в таком случае и о С++ никто ничего не говорил:))
Спасибо, но при одинаковых тестов времена выполнениев отличаются, чего посоветуете ?
Это нормально, если несильно отличаются.
посоветую посчитать среднее
как раз речь о том, что использовать астрономическое время не совсем точно, оно сильно зависит от текущей загрузки системы. Процессорное — не зависит от того, что вы еще параллельно делаете
Под Windows можно использовать либо runexe (написано нами — Саратовским ГУ), либо run.exe (авторства ИТМО). Я рекомендую наш вариант :) он не запускает код в дебаге, а иногда запуск в debug приводит к очень странным (читай неправльным( измерениям.
Ага, иногда на порядок-другой время работы изменяется. А не знаете, зачем запускать в debug?
Так они ловят некоторые events — типа, что программа создала другой процесс и видимо кое-что еще.
Кажется это чаще всего происходит при работе с динамическими структурами или большой рекурсией.
Кажется, утверждается, что под debug медленно работает delete. То есть если совсем много удаляется, то run.exe замедляет выполнение очень сильно. Кстати, интересно как они с этим борются на официальных соревнованиях. Представители ИТМО есть? Расскажете?
Вроде есть какой-то хитрый ключ в реестре
Интересно какой именно. Кстати, полезно-же опубликовать — иначе зачем run.exe вообще нужен? Ведь его важная задача определять время работы для околоолимпиадных целей, а там такие программы, где он будет лажать не редкость. Даже пользоваться как-то страшно. Или вот люди PCMS2 ставят, они это настраивают?
Нужно прописать такой ключ
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\your_exe_name.exe
Спасибо. Правильно я понимаю, что такое предполагается прописывать для каждого exe (напр., java, все интерпретаторы), а компилируемые переименовывать в какое-то хардкодное имя? your_exe_name.exe — это только имя файла, без пути? (например,
main.exe
).Да, именно так. Ну либо написать обертку, которая добавит в реестр ключ для запускаемого файла, запустит, а потом ключ удалит (можно даже на cmd, при помощи reg add и reg delete)
Спасибо , a как пользоваться runexe-ом ?
runexe -h
, но если просто хотите измерить время, тоrunexe solution.exe
. Можноrunexe -i input.txt -o output.txt solution.exe
если хотите перенаправлять ввод/вывод на стандартный из файлов. Еще вариантrunexe -t 2s -i input.txt -o output.txt solution.exe
— это с ограничением по времени.Для Farа очень удобно поставить ассоциацию с типом файлов *.exe и по нажатию например на F4, чтобы запускался runexe. Всегда так делаю))
Я как-то раз пробовал запускать runexe с указанием логина и пароля юзера, под правами которого я хотел чтоб программа запустилась. Но у меня это так и не получилось. Там видимо надо какие-то специальные привилегии настраивать?
Тот же вопрос относится и к run.exe от ИТМО...
Для run.exe надо так — допустим, мы работаем под аккаунтом Jury и хотим запустить под аккаунтом invoker. Тогда Jury навешиваем привилегии "Increase quotas" (SeIncreaseQuota) и "Replace a process level token" (SeAssignPrimaryToken), а invoker — "Log on as batch job" в Administrative Tools — Local Security Settings — Local Policies — User Right Assignment. У меня вдобавок Jury имеет администраторские права, что небезопасно, но отнимать не пробовал; надо попытаться :)
Кстати, правильно ли я понимаю, что исходники файла /src/runlib/runlib32-static.lib закрыты? Если да, то можно ли узнать, в каких случаях выдаётся ошибка SECURITY_VIOLATION (т.е., за чем следит runexe)? Потому что, например, за работой с ФС вроде из общедоступных запускальщиков под Windows никто не следит.
Проект открыт — первая ссылка в Google.
Однако там почти нет этого кода, для этого используются другие технологии: они местами точные, местами эвристические, поэтому мы их не публикуем.
Открыты (см. линк на странице проекта runexe).
А планируется ли переезд runexe с закрытого хостинга на, скажем, GitHub?
Есть еще такая вещь, как QueryPerformanceCounter (вкупе с QueryPerformanceFrequency). Измеряет кол-во "тиков" процессора с момента запуска системы, поэтому выходит довольно точно. Не знаю, как в других средах, но как-то пробовал измерять время работы кода на Delphi, проблема была только одна — погрешность +/-0.5 ms (ибо на машине работают еще и другие программы, которые отнимают время). Ну, если совсем точно надо — можно посчитать раз 20 и найти среднее :))
Приятней искать минимальное :)
ptime — меряет хорошо. Можно скопировать в папку с прогой, время работы которой хочется измерить. Перенаправление ввода-вывода и вызов программы (предварительно перейдя в папку с ней): ptime program < input.txt > output.txt. Без перенаправления так: ptime program. Из замеченных глюков — иногда файлы долго открываются (не у всех, в частности наблюдаю у себя на винде, но это сбои ФС), и порой 500 мс можно легко скинуть (это уже экспериментировать со своей системой надо). Но на большинстве машин такого не наблюдается, и время показывается "нормальное".
http://www.cplusplus.com/reference/clibrary/ctime/clock/
P.S. in english version previous comments aren't shown, no need to "vote down".
Подскажите, как при помощи run.exe запретить создание дочерних процессов? Например, вот такой код
успешно выполняется. Время будет считаться до тех пор, пока блокнот не будет закрыт вручную. После этого, вердикт будет Idleness limit exceeded. Но хотелось бы, чтобы дочерние процессы убивались автоматически.