OberonCore
https://forum.oberoncore.ru/

Как лучше определить время выполнения программы?
https://forum.oberoncore.ru/viewtopic.php?f=27&t=3128
Страница 1 из 1

Автор:  Евгений Семашко [ Четверг, 06 Январь, 2011 17:12 ]
Заголовок сообщения:  Как лучше определить время выполнения программы?

Доброго времени суток, господа!
С наступившим новым годом всех и Рождеством!
Задался недавно вопросом как точно измерить время выполнения прграммы.
Суть в том, что есть программулина, которая вызывает внешний компрессор файла и подсчитывает сколько времени этот компрессор работал.
Так вот. При измерении времени работы одного и того же компрессора на одном и том же файле получаются совершенно различные результаты. Конечно, это не метрология, и самый адекватный результат будет результатом с наименьшим временем работы программы, однако сюда вмешиваются такие факторы, как быстродействие винчестера, загруженность процессора, окружение операционки и т.д. и т.п.
Можно ли каким-то образом "идеально" подсчитать время работы программы или стоит сделать скидку на все негативные факторы и оперировать только понятием "порядка времени"?
Заранее благодарю за здравые мысли.

Автор:  Илья Ермаков [ Четверг, 06 Январь, 2011 17:23 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

Я так понимаю, тебе нужно будет сравнивать разные компрессоры - и нужен более-менее объективный цифирь-"вес" для каждого компрессора?

Ну, рассчитай сначала среднее время потерь на данной машине - засеки много раз и усредни время вызова своей программы-пустышки.

Затем для каждого компрессора после многократного засечения так же усредни и вычти посчитанные ранее "средние потери".

Автор:  Евгений Семашко [ Четверг, 06 Январь, 2011 17:29 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

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

Автор:  Александр Ильин [ Четверг, 06 Январь, 2011 17:34 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

Рекомендую использовать не жёсткий диск, а виртуальный, полностью размещённый в памяти. Плюс, брать время работы в user space, и не брать kernel space.

Автор:  alexus [ Пятница, 07 Январь, 2011 01:58 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

Евгений Семашко писал(а):
Да, я так и сделаю, спасибо, но все равно это не идеальный случай, хотя так будет вернее всего.
Идеальный вариант получить нереально. Даже если дизассеблировать программу и подсчитать число тактов по каждой команде, то... придется учитывать то, что разные процессоры по разному группируют и параллелят выполнение команд, имеют разный размер кэша, разное количество ядер, реализуют различные алгоритмы предсказателей ветвлений... Да, и сами команды выполняются за разное количество тактов на разных процессорах. Но и это не все... придется учитывать параллельные процессы и их потоки, так как процессор на них переключается. Учитывать обработку прерываний и пр. Так что, статистика - единственный относительно простой вариант. Хотя разбросы в показаниях могут быть очень большими.

Автор:  Alexey Veselovsky [ Пятница, 07 Январь, 2011 02:15 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

Александр Ильин писал(а):
Рекомендую использовать не жёсткий диск, а виртуальный, полностью размещённый в памяти. Плюс, брать время работы в user space, и не брать kernel space.

В результате можно легко нарваться на разницу работы кэш-памяти разных уровней и оперативной памяти. А у разных процессоров кэш организован сильно по разному.

Автор:  Александр Ильин [ Пятница, 07 Январь, 2011 08:40 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

Alexey Veselovsky писал(а):
А у разных процессоров кэш организован сильно по разному.
Откуда вообще взялась идея про разные процессоры?

Автор:  Евгений Семашко [ Пятница, 07 Январь, 2011 13:54 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

Александр Ильин писал(а):
Рекомендую использовать не жёсткий диск, а виртуальный, полностью размещённый в памяти. Плюс, брать время работы в user space, и не брать kernel space.

Этот момент не очень понятен, разве все программы пользователя выполняются не в user space?

Автор:  Александр Ильин [ Пятница, 07 Январь, 2011 14:22 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

Евгений Семашко писал(а):
Александр Ильин писал(а):
Рекомендую использовать не жёсткий диск, а виртуальный, полностью размещённый в памяти. Плюс, брать время работы в user space, и не брать kernel space.

Этот момент не очень понятен, разве все программы пользователя выполняются не в user space?
В том-то и дело, что да. Весь код пользовательских программ типа архиваторов выполняется в user space, но когда вы вызываете что-либо из WinApi, часть времени выполнения может тратиться на вызов кода kernel space - например, запись файла на диск соответствующим драйвером.

Автор:  Евгений Семашко [ Пятница, 28 Январь, 2011 22:20 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

Спасибо всем за советы. Возник такой вопрос.
Есть кластер из 30 компьютеров. Каждые 10 компьютеров имеют различные конфигурации, следовательно, различную производительность и так далее. Я хочу определить время выполнения программы, если можно так сказать, абсолютное, т.е. сколько программа будет выполняться вне зависимости от производительности системы. Я предположил, что так можно сделать с использованием функции, которая будет подсчитывать количество шагов процессора, затем делить это количество шагов на частоту процессора. Порылся в сторону GetTickCount, это не совсем то, что нужно, поскольку тоже возвращает только время, а не количество шагов. Многие в сети пишут про QueryPerformanceCounter, но у него тоже своих причудов очень много, мягко говоря http://www.devdoc.ru/index.php/content/ ... ounter.htm http://www.freepascal.ru/forum/viewtopic.php?f=1&t=6352
Вопрос такой. Можно ли вообще с помощью каких-то средств ТОЧНО подсчитать количество шагов и вычислить АБСОЛЮТНОЕ время выполнения программы на определенной машине?

Автор:  Александр Шостак [ Пятница, 28 Январь, 2011 22:38 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

Нельзя, к сожалению.

Автор:  Илья Ермаков [ Понедельник, 31 Январь, 2011 01:20 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

В WinNT есть такая штука - PERFORMANCE_DATA. ОС делает всякие замеры по работающим процессам и проч.

Эта штука доступна через специальную базу данных в памяти ОС, которая доступна как ветка реестра HKEY_PERFORMANCE_DATA, т.е. можно работать через ф-и реестра.

У Рихтера в "Вин2000" есть пример... на стр. 83.

Можно попробовать копнуть в эту сторону.

Автор:  Илья Ермаков [ Понедельник, 31 Январь, 2011 01:26 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

Оооо, всё проще пареной репы.

Есть функция GetThreadTimes, которая даёт временную статистику по конкретному потоку. У Рихтера - стр. 160.

BOOL GetThreadTimes (HANDLE hThread, PFILETIME pftCreationTime, PFILETIME pftExitTime, PFILETIME pftKernelTime, PFILETIME pftUserTime)

Чтобы получить по текущему потоку, даём первым параметром GetCurrentThread().

Общее время потока - сложить kernel-time и user-time. Kernel-time показывает, сколько поток сидел в вызовах ОС (ввод-вывод и проч.). User-time - всё остальное (не только сам поток, любые библиотеки; даже гуй виндовый значительной частью, думаю, тут).

Автор:  Евгений Семашко [ Понедельник, 31 Январь, 2011 18:11 ]
Заголовок сообщения:  Re: Как лучше определить время выполнения программы?

Спасибо! Будем рыть!

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/