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? |
Автор: | Евгений Семашко [ Пятница, 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/ |