Я решил узнать, какая реализация штриха Шеффера выполняется быстрее. Для этого я решил воспользоваться функиями 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
Почему на цикл без тела уходит больше всего времени? Почему реализация при помощи логических операций выдаёт настолько разные временные показатели?