OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 00:44

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 06 Январь, 2011 17:12 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Январь, 2011 17:23 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Я так понимаю, тебе нужно будет сравнивать разные компрессоры - и нужен более-менее объективный цифирь-"вес" для каждого компрессора?

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Январь, 2011 17:29 

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:43
Сообщения: 14
Откуда: Россия, Орёл
Да, я так и сделаю, спасибо, но все равно это не идеальный случай, хотя так будет вернее всего.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Январь, 2011 17:34 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Рекомендую использовать не жёсткий диск, а виртуальный, полностью размещённый в памяти. Плюс, брать время работы в user space, и не брать kernel space.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Январь, 2011 01:58 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Январь, 2011 02:15 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Александр Ильин писал(а):
Рекомендую использовать не жёсткий диск, а виртуальный, полностью размещённый в памяти. Плюс, брать время работы в user space, и не брать kernel space.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Январь, 2011 08:40 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Alexey Veselovsky писал(а):
А у разных процессоров кэш организован сильно по разному.
Откуда вообще взялась идея про разные процессоры?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Январь, 2011 13:54 

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:43
Сообщения: 14
Откуда: Россия, Орёл
Александр Ильин писал(а):
Рекомендую использовать не жёсткий диск, а виртуальный, полностью размещённый в памяти. Плюс, брать время работы в user space, и не брать kernel space.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Январь, 2011 14:22 
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 28 Январь, 2011 22:20 

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:43
Сообщения: 14
Откуда: Россия, Орёл
Спасибо всем за советы. Возник такой вопрос.
Есть кластер из 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 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Нельзя, к сожалению.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 31 Январь, 2011 01:20 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В WinNT есть такая штука - PERFORMANCE_DATA. ОС делает всякие замеры по работающим процессам и проч.

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 31 Январь, 2011 01:26 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Оооо, всё проще пареной репы.

Есть функция 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 

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:43
Сообщения: 14
Откуда: Россия, Орёл
Спасибо! Будем рыть!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB