OberonCore https://forum.oberoncore.ru/ |
|
Как измерить время, за которое выполняется часть программы? https://forum.oberoncore.ru/viewtopic.php?f=23&t=6505 |
Страница 1 из 1 |
Автор: | Александр К [ Среда, 04 Декабрь, 2019 15:56 ] |
Заголовок сообщения: | Как измерить время, за которое выполняется часть программы? |
Я решил узнать, какая реализация штриха Шеффера выполняется быстрее. Для этого я решил воспользоваться функиями QueryPerformanceCounter и QueryPerformanceFrequency библиотеки Kernel32.dll. Код: MODULE KnyshMyTime ["Kernel32.dll"]; PROCEDURE QueryPerformanceCounter* (OUT lpPerformanceCount: LONGINT): BOOLEAN; PROCEDURE QueryPerformanceFrequency* (OUT lpFrequency: LONGINT): BOOLEAN; END KnyshMyTime. MODULE KnyshStroke; IMPORT StdLog, KnyshMyTime; CONST nMax = 1000000; VAR constB: LONGINT;(*количество тиков в секунду*) PROCEDURE TimeCalculation (lStart, lEnd: LONGINT);(*вычисление скорости записи/чтения*) VAR a : REAL; BEGIN a := (lEnd - lStart) / constB;(* - constC;*) StdLog.Real(a); StdLog.Ln; END TimeCalculation; PROCEDURE Start*;(**) VAR i: INTEGER; lageStart, lageEnd: LONGINT; bool, a, b, c: BOOLEAN; BEGIN bool := KnyshMyTime.QueryPerformanceFrequency(constB);(*количество тиков в секунду*) a := TRUE; b := TRUE; (*измерение времени, потраченного на цикл без тела*) bool := KnyshMyTime.QueryPerformanceCounter(lageStart); FOR i := 0 TO nMax DO END; bool := KnyshMyTime.QueryPerformanceCounter(lageEnd); StdLog.String ("Время, потраченное на цикл без тела: "); TimeCalculation (lageStart, lageEnd); (*измерение времени, потраченного на реализацию при помощи условного оператора*) bool := KnyshMyTime.QueryPerformanceCounter(lageStart); FOR i := 0 TO nMax DO IF a THEN IF b THEN (*1 1*) c := FALSE ELSE (*1 0*) c := TRUE END ELSE IF b THEN (*0 1*) c := TRUE ELSE (*0 0*) c := TRUE END END END; bool := KnyshMyTime.QueryPerformanceCounter(lageEnd); StdLog.String ("Время, потраченное на цикл с условным оператором: "); TimeCalculation (lageStart, lageEnd); (*измерение времени, потраченного на реализацию при помощи логических операций*) bool := KnyshMyTime.QueryPerformanceCounter(lageStart); FOR i := 0 TO nMax DO c := ~ a OR ~b END; bool := KnyshMyTime.QueryPerformanceCounter(lageEnd); StdLog.String ("Время, потраченное на цикл с выражением из логических операторов: "); TimeCalculation (lageStart, lageEnd); StdLog.Ln END Start; END KnyshStroke. Результаты работы программы: Цитата: Время, потраченное на цикл без тела: 0.006954014459261772 Время, потраченное на цикл с условным оператором: 0.006612962033771781 Время, потраченное на цикл с выражением из логических операторов: 0.006601707041986616 Время, потраченное на цикл без тела: 0.006958202363181834 Время, потраченное на цикл с условным оператором: 0.006618196913671858 Время, потраченное на цикл с выражением из логических операторов: 0.006595425186106524 Время, потраченное на цикл без тела: 0.006957678875191825 Время, потраченное на цикл с условным оператором: 0.006617935169676853 Время, потраченное на цикл с выражением из логических операторов: 0.006608512385856716 Время, потраченное на цикл без тела: 0.00696683991501696 Время, потраченное на цикл с условным оператором: 0.006657720256917436 Время, потраченное на цикл с выражением из логических операторов: 0.006604586225931658 Время, потраченное на цикл без тела: 0.006953229227276761 Время, потраченное на цикл с условным оператором: 0.006623693537566938 Время, потраченное на цикл с выражением из логических операторов: 0.006631022369427045 Время, потраченное на цикл без тела: 0.006938048075566539 Время, потраченное на цикл с условным оператором: 0.006565586370676087 Время, потраченное на цикл с выражением из логических операторов: 0.001824879133166707 Время, потраченное на цикл без тела: 0.006960558059136868 Время, потраченное на цикл с условным оператором: 0.006542552899115751 Время, потраченное на цикл с выражением из логических операторов: 0.003299021313028281 Почему на цикл без тела уходит больше всего времени? Почему реализация при помощи логических операций выдаёт настолько разные временные показатели? |
Автор: | Ярослав Романченко [ Среда, 04 Декабрь, 2019 16:38 ] |
Заголовок сообщения: | Re: Как измерить время, за которое выполняется часть програм |
Возможно, по той причине, что современные процессоры постоянно меняют тактовую частоту. Можно перед всеми замерами вставить дополнительный цикл "для разогрева". Я в своё время тоже увлёкся всеми этими синтетическими бенчмарками. Более-менее достоверное время можно получить, по-моему, только взяв мат.ожидание времени выполнения по серии нескольких замеров. За счёт вычисления мат.ожидания можно отбраковать результаты, которые сильно отклоняются от нормы. |
Автор: | Иван Денисов [ Среда, 04 Декабрь, 2019 19:04 ] |
Заголовок сообщения: | Re: Как измерить время, за которое выполняется часть програм |
Не реально так получить данные о времени одного выполнения. Надо делать измерение хотя бы 10000 повторов. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |