ãã®èšäºã®ç®ç㯠ãå¯èœãªéãæ£ç¢ºã«æéãæž¬å®ããæ¹æ³ã«é¢ããåé¡ã®äœæ¥äžã«åŸãããè³æãæç€ºãããããã®æ¹æ³ãå®éã«äœ¿çšããããšãšãéæå¯èœãªæé«ã®ç²ŸåºŠã§ãœãããŠã§ã¢ã管çããããã®ãªãã·ã§ã³ãæ€èšããããšã§ãã
ãã®èšäºã¯ ããã§ã«ããã°ã©ãã³ã°ã®çµéšããããæšæºæ©èœã®æéééã®é²åºã®ç²ŸåºŠã®åé¡ã«æ°ã¥ãèªè
ã察象ãšããŠããŸãã ãã¹ãŠã®ã¡ãœããã¯ãã®èšèªã§å®è£
ãããŠãããããèšäºã®èè
begin_end㯠ãDelphiã§ããã°ã©ãã³ã°ããèªè
ã«ã¢ããã€ã¹ããŠããŸãã
ç§ãã¡ã®ã¿ã¹ã¯ã¯ãçãæéééïŒæãŸãã粟床ã¯10 ^ -6ç§ïŒã®æ£ç¢ºãªæž¬å®ã®ããã®æè¯ã®æ¹æ³ãèŠã€ããåã粟床ã§ã³ãŒãã®å®è¡ã«ãããé
å»¶ã®ããã°ã©ãã³ã°ã®æã广çãªæ¹æ³ã決å®ããããšã§ãã
ããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã¢ããªã±ãŒã·ã§ã³ïŒããšãã°ãããŒã¿éä¿¡ãŸãã¯ä¿¡å·çæ/åæã«é¢é£ããã¢ããªã±ãŒã·ã§ã³ïŒãæ¢ã«éçºããããšããããã°ã©ããŒã¯ãæéééã®å€ãå°ããå Žåããã¹ãŠã®æšæºæ©èœïŒ
ã¹ãªãŒããããŒãé³ãGetTickCount ãã¿ã€ããŒïŒã«å€§ããªãšã©ãŒãããããšã«æ°ä»ãããšããããŸãã
ããã¯ãã·ã¹ãã ã¿ã€ããŒã®è§£å床ã«ãã£ãŠæ±ºãŸããŸããã·ã¹ãã ã¿ã€ããŒã®å€ã¯ãã³ã³ãã¥ãŒã¿ãŒã«ãã£ãŠå€å°ç°ãªãå ŽåããããŸãã GetSystemTimeAdjustment颿°ã䜿çšããŠããã®èš±å¯ã確èªã§ããŸãã
BOOL GetSystemTimeAdjustment(
PDWORD lpTimeAdjustment, // size, in 100-nanosecond units, of a periodic time adjustment
PDWORD lpTimeIncrement, // time, in 100-nanosecond units, between periodic time adjustments
PBOOL lpTimeAdjustmentDisabled // whether periodic time adjustment is disabled or enabled
);
Delphiã§äœ¿çšããããã«ãã®é¢æ°ãåæããŸãããã LpTimeIncrementã¯ãã·ã¹ãã ã¿ã€ããŒã®è§£å床ã100ããç§åäœã§èšé²ããŸãã ãã®å€ãååŸããŠãããšãã°ããªç§åäœã§åºåããå¿
èŠããããŸãã ããã«ããããã®ãããªããã°ã©ã ãäœæãããŸãïŒ
äŸ1ãåç
§ ïŒã
program SysTmrCycle;
{$APPTYPE CONSOLE}
uses
SysUtils, windows;
var a,b:DWORD; c:bool;
begin
GetSystemTimeAdjustment(a,b,c);
WriteLn('System time adjustment: '+FloatToStr(b / 10000)+' ms.');
WriteLn;
Writeln('Press any key for an exit...');
Readln;
end.
å®è¡çµæãç»é¢ã«è¡šç€ºãããã¿ã€ããŒå€ã¯10.0144ããªç§ã§ããããšã倿ããŸããã
ãã®å€ã¯æ¬åœã«ã©ãããæå³ã§ããïŒ é¢æ°ã®æéééãã»ãŒåžžã«ãã®å€ã®åæ°ã«ãªããšããäºå®ã 10.0144ããªç§ã®å Žåã
ã¹ãªãŒãïŒ1000ïŒæ©èœã«ãã1001.44ããªç§ã®é
å»¶ãçºçããŸãã
sleepïŒ5ïŒãåŒã³åºã
ãšãé
å»¶ã¯çŽ10ããªç§ã«ãªããŸãã æšæºã®Delphiã¿ã€ããŒã§ããTTimerãªããžã§ã¯ãã¯ãèªç¶ã«ãšã©ãŒãèµ·ãããããåŸåããããŸããããã®çšåºŠã¯ããã«å€§ãããªããŸãã TTimerãªããžã§ã¯ãã¯ãéåžžã®Windowsã¿ã€ããŒã«åºã¥ããŠããããŠã£ã³ããŠãšéåæã§ã¯ãªãWM_TIMERã¡ãã»ãŒãžãéä¿¡ããŸãã ãããã®ã¡ãã»ãŒãžã¯ãä»ã®ãã¹ãŠã®ã¡ãã»ãŒãžãšåæ§ã«ãã¢ããªã±ãŒã·ã§ã³ã®éåžžã®ã¡ãã»ãŒãžãã¥ãŒã«å
¥ããããŠåŠçãããŸãã ããã«ãWM_TIMERã¯ãä»ã®ã¡ãã»ãŒãžãšæ¯èŒããŠæãäœãåªå
床ïŒWM_PAINTãé€ãïŒãæã£ãŠããŸãã
GetMessageã¯ããã¥ãŒã«åªå
床ã¡ãã»ãŒãžããªããªã£ãå Žåã«ã®ã¿åŠçã®ããã«WM_TIMERã¡ãã»ãŒãžãéä¿¡ããŸã-WM_TIMERã¡ãã»ãŒãžã¯ããªãã®æéé
å»¶ããå¯èœæ§ããããŸãã é
å»¶æéãééãè¶
ãããšãã¡ãã»ãŒãžãçµåããããããæå€±ãçºçããŸã[1]ã
å°ãªããšãäœããã®æ¹æ³ã§é
延颿°ã®æ¯èŒåæã枬å®ããã«ã¯ãã³ãŒãã®ç¹å®ã®ã»ã¯ã·ã§ã³ã®å®è¡ã®æéééãæ£ç¢ºã«æž¬å®ã§ããããŒã«ãå¿
èŠã§ãã äžèšã®ããã
GetTickCountã¯æ©èœããŸããã ããããèè
ã¯ãç¹å®ã®æéééã§ããã»ããµã®ã¯ããã¯åšæ³¢æ°ã«äŸåããèœåã«ã€ããŠç¥ããŸããã Pentium III以éã§ã¯ãããã»ããµã«ã¯éåžžãããã°ã©ãã®ãªã¢ã«ã¿ã€ã ã«ãŠã³ã¿ãŒã«ãŠã³ã¿ãŒãã¿ã€ã ã¹ã¿ã³ãã«ãŠã³ã¿ãŒã
TSCãå«ãŸããŠããŸããããã¯ãã¯ããã¯ãµã€ã¯ã«ããšã«å
容ãã€ã³ã¯ãªã¡ã³ãããã64ãããã®ã¬ãžã¹ã¿ã§ã[2]ã ã«ãŠã³ã¿ãŒã®ã«ãŠã³ãã¯ãã³ã³ãã¥ãŒã¿ãŒã®èµ·åïŒãŸãã¯ããŒããŠã§ã¢ãªã»ããïŒã®ãã³ã«ãŒãããå§ãŸããŸãã Delphiã§æ¬¡ã®ããã«ã«ãŠã³ã¿å€ãååŸã§ããŸãïŒ
äŸ2ãåç
§ ïŒã
program rdtsc_view;
{$APPTYPE CONSOLE}
uses
SysUtils, windows;
function tsc: Int64;
var ts: record
case byte of
1: (count: Int64);
2: (b, a: cardinal);
end;
begin
asm
db $F;
db $31;
mov [ts.a], edx
mov [ts.b], eax
end;
tsc:=ts.count;
end;
begin
repeat WriteLn(FloatToStr(tsc)) until false;
end.
ããã§ãã¢ã»ã³ãã©ãŒã®æ¿å
¥ã¯ã«ãŠã³ã¿ãŒçµæã
edxããã³
eaxã¬ãžã¹ã¿ãŒã«å
¥ãããã®å€ã¯tsã«è»¢éãããããããInt64åã®ts.countãšããŠäœ¿çšã§ããŸãã äžèšã®ããã°ã©ã ã¯ãã³ã³ãœãŒã«ã«ã«ãŠã³ã¿ãŒå€ãç¶ç¶çã«è¡šç€ºããŸãã Delphiã®äžéšã®ããŒãžã§ã³ã«ã¯ã次ã®ãããª
RDTSC颿°[
3 ]
ã䜿çšããŠã«ãŠã³ã¿ãŒå€
ãããã«ååŸã§ããæ¢è£œã®
rdtsc ïŒã¿ã€ã ã¹ã¿ã³ãã«ãŠã³ã¿ãŒã®èªã¿åãïŒã³ãã³ãããããŸãã
function RDTSC: Int64; register;
asm
rdtsc
end;
ã«ãŠã³ã¿ãŒå€ããããšä»®å®ããŸããããã®äœ¿ç𿹿³ã¯ïŒ ãšãŠãç°¡åã§ãã å€ãäžå®ã®é »åºŠã§å€åãããšããäºå®ã«åºã¥ããŠã調æ»äžã®ã³ãã³ãã®åŸãšãã®åã®ããã»ããµãµã€ã¯ã«æ°ã®å·®ãèšç®ã§ããŸãã
a:=tsc;
Command;
b:=tsc-a;
bã«ã¯ãã³ãã³ãã®å®è¡äžã«çµéããããã»ããµãµã€ã¯ã«ã®æ°ãå
¥ããŸãã ãããã1ã€ã®ãã€ã³ãããããŸãã
ã¡ãžã£ãŒã®æ°ãæäŸãã
tscåŒã³åºãããããã«ããã€ãã®ã¡ãžã£ãŒãè²»ããå¿
èŠããããŸãã ãããŠãçµæã®å¿ å®åºŠã®ããã«ãåŸãããã¡ãžã£ãŒã®æ°ããå·®ãåŒãããè£æ£ãšããŠå°å
¥ãããªããã°ãªããŸããïŒ
a:=tsc;
C:=tsc-a;
a:=tsc;
Command;
b:=tsc-aC;
ãã¹ãŠããŸããããŸãããå®éšçã«ã¯ãè£æ£Cã®å€ãç°ãªãããšããããŸãã ãã®çç±ã¯èŠã€ãããŸããã ããã§ã®ãã€ã³ãã¯ãç¹ã«ããã»ããµãŒã®æ©èœããŸãã¯ããããã®ã³ã³ãã€ãŒã§ãã ã³ã³ãã¢ã«æ²¿ã£ãæ©æ¢°åœä»€ã®åé²ã¯ãããã€ãã®åºæ¬çãªå°é£ã«é¢é£ããŠããŸããããããã®å Žåãã³ã³ãã¢ã¯ã¢ã€ãã«ç¶æ
ã§ãã åœä»€ã®å®è¡æéã¯ããããããã€ãã©ã€ã³ã®ã¹ã«ãŒãããã«ãã£ãŠæ±ºãŸããŸãã ããã»ããµãµã€ã¯ã«ãåä¿¡ããŠââä¿èšŒãããããšãä¿èšŒãããæééé-50ãµã€ã¯ã«ãã[2]ã è£æ£ã決å®ãããå Žåãæãæ£ç¢ºãªå€ã¯æå°å€ã«ãªãããšãããããŸãã å®éšçã«ãä¿®æ£é¢æ°ãæå€§10ååŒã³åºãã ãã§ååã§ãã
function calibrate_runtime:Int64;
var i:byte; tstsc,tetsc,crtm:Int64;
begin
tstsc:=tsc;
crtm:=tsc-tstsc;
for i:=0 to 9 do
begin
tstsc:=tsc;
crtm:=tsc-tstsc;
if tetsc<crtm then crtm:=tetsc;
end;
calibrate_runtime:=crtm;
end;
å¿
èŠãªããŒã«ãæã£ãã®ã§ãé
延颿°ã詊ããŠã¿ãŸãããã ããç¥ããåºã䜿çšãããŠãã
ç¡ç ããå§ããŸãããïŒ
procedure Sleep(milliseconds: Cardinal); stdcall;
é
å»¶ã®æ£ç¢ºãã確èªããããã«ãã³ã³ãœãŒã«ããã°ã©ã ã«ã
TSCã³ãŒããš
ãã£ãªãã¬ãŒã·ã§ã³ ã©ã³ã¿ã€ã ã³ãŒãã«å ããŠã次ã®ã³ãŒããå«ããŸãã
function cycleperms(pau_dur:cardinal):Int64;
var tstsc,tetsc:Int64;
begin
tstsc:=tsc;
sleep(pau_dur);
tetsc:=tsc-tstsc;
cycleperms:=(tetsc-calibrate_runtime) div pau_dur;
end;
ããã°ã©ã ãããã®ã³ãŒããåŒã³åºããŠãpau_durã®å€ïŒããŒãºïŒãæ°åèšå®ããŸãæ°ã¥ããããããŒãºäžã®å°ç¯æ°ãããŒãºå€ã§å²ã£ãŠãã ããã ãã®ãããæéã«å¿ããŠé
å»¶ã®ç²ŸåºŠãããããŸãã ãã¹ããå®è¡ãããã¹ãçµæã衚瀺/ä¿åããããã«ã次ã®ã³ãŒãã䜿çšãããŸããïŒ
äŸ3ãåç
§ ïŒã
var test_result,temp_result:string; n:cardinal; i:byte; aver,t_res:Int64; res:TextFile;
begin
WriteLn('The program will generate a file containing the table of results of measurements of quantity of cycles of the processor in a millisecond. Time of measurement is chosen'+' miscellaneous, intervals: 1, 10, 100, 1000, 10000 ms. You will see distinctions of measurements. If an interval of measurement longer - results will be more exact.');
WriteLn;
Writeln('Expected time of check - 1 minute. Press any key for start of the test...');
ReadLn;
temp_result:='Delay :'+#9+'Test 1:'+#9+'Test 2:'+#9+'Test 3:'+#9+'Test 4:'+#9+'Test 5:'+#9+'Average:';
n:=1;
test_result:=temp_result;
WriteLn(test_result);
while n<=10000 do
begin
temp_result:=IntToStr(n)+'ms'+#9;
aver:=0;
for i:=1 to 5 do
begin
t_res:=cycleperms(n);
aver:=aver+t_res;
temp_result:=temp_result+IntToStr(t_res)+#9;
end;
WriteLn(temp_result+IntToStr(aver div 5));
test_result:=test_result+#13+#10+temp_result+IntToStr(aver div 5);
n:=n*10;
end;
WriteLn;
AssignFile(res,'TCC_DEF.xls');
ReWrite(res);
Write(res,test_result);
CloseFile(res);
WriteLn('The test is completed. The data are saved in a file TCC_DEF.xls.');
Writeln('Press any key for an exit...');
ReadLn;
end.
ãã®äžã§ãåæéééïŒ
1ã10,000ããªç§ïŒã§
cyclepermsã 5åå®è¡ããå¹³åå€ãèæ
®ããŸãã ããŒãã«ã倿ããŸããã ãã®ããããã®ãããªèª¿æ»äžã«ååŸãããããã»ããµã¯ããã¯ã®æ°ïŒ

ç§ãã¡ã芳å¯ããŠããåçã¯æé«ã§ã¯ãããŸããã ããã»ããµã®åšæ³¢æ°ã¯çŽ1778.8 MHzïŒ
äŸ4ãåç
§ ïŒã§ããããã1ããªç§ã®ã¯ããã¯å€ã¯çŽ1778800ã®æ°å€ãç®æãå¿
èŠããããŸãã
ã¹ãªãŒãæ©èœã®ç²ŸåºŠã¯ã1ã10ã100ããŸãã¯1000ããªç§ã®éãããäžããŸããã å€ãè¿ãã®ã¯ã10ç§éã ãã§ãã ããããããã¹ã4ã§1781146ããªãã£ãå Žåãå¹³åå€ã¯èš±å®¹ç¯å²ã«ãªããŸãã
äœãã§ããŸããïŒ é¢æ°ãé¢ããŠãäœãä»ã®ãã®ãæ€èšããŸããïŒ ãŸã æ¥ãã§ã¯ãããŸããã
timeBeginPeriod [2]颿°ã䜿çšããŠãåºæºæéééã®ãšã©ãŒãæåã§èšå®ã§ããããšãããããŸããã
MMRESULT timeBeginPeriod(
UINT uPeriod
);
ãã®é«ç²ŸåºŠã®è§£å床ãç¶æããã«ã¯ã远å ã®ã·ã¹ãã ãªãœãŒã¹ã䜿çšãããããããã¹ãŠã®æäœãå®äºããåŸã«
timeEndPeriodãåŒã³åºããŠ
ããããè§£æŸããå¿
èŠããããŸãã ãã®ãããª
ç¡ç ã調æ»ããããã®cycleperms颿°ã®ã³ãŒãïŒ
äŸ5ãåç
§ ïŒïŒ
function cycleperms(pau_dur:cardinal):Int64;
var tstsc,tetsc:Int64;
begin
timeBeginPeriod(1);
sleep(10);
tstsc:=tsc;
sleep(pau_dur);
tetsc:=tsc-tstsc;
timeEndPeriod(1);
cycleperms:=(tetsc-calibrate_runtime) div pau_dur;
end;
解決äžå¯èœãªæ©èœã§ãã
timeBeginPeriodïŒ1ïŒã¯ãè§£å床ã1ããªç§ã«èšå®ããŸãããããã«å¹æãçŸããªããªããŸããã
ã¹ãªãŒãã³ãŒã«ã®åŸã§
ã®ã¿ã§ãããã®ããã
timeBeginPeriodã®åŸã«ã³ãŒãã«
sleepïŒ10ïŒãæ¿å
¥ãããŸãã ãã®ç ç©¶ã®çµæïŒ

芳枬ãããããŒã¿ã¯ã¯ããã«åªããŠããŸãã 10ç§ã«ãããå¹³åã¯ããªãæ£ç¢ºã§ãã 1ããªç§ã®å¹³åã¯1.7ïŒ
ã ãç°ãªããŸãã ãããã£ãŠã10ããªç§ã®å·®ã¯0.056ïŒ
ã100ããªç§-0.33ïŒ
ïŒã¹ãã¬ã³ãžãçºçïŒã1000ããªç§-0.01ïŒ
ã§ãã 1 msããçãééã¯ã
ã¹ãªãŒãã§ã¯äœ¿çšã§ããŸããã ãã ãã
timeBeginPeriodïŒ1ïŒãå®è¡ãããæå®ãããæéééãé·ããªããš
ã¹ãªãŒãã®ç²ŸåºŠãäžããã ãã§ã
ã¹ãªãŒã㯠1ããªç§ã®äŒæ¢ã«é©ããŠãããš
æèšã§ããŸãïŒ
äŸ6ãåç
§ ïŒã
ã¹ãªãŒã颿°ã¯ã
NtDelayExecution颿°ã®ãã€ãã£ãAPIã«åºã¥ããŠãããæ¬¡ã®åœ¢åŒããããŸã[
5 ]ã
NtDelayExecution(
IN BOOLEAN Alertable,
IN PLARGE_INTEGER DelayInterval );
sleepã®ãããªé
å»¶ããã¹ãããŠã¿ãŸããããããã€ã¯ãç§ã§ããããèæ
®ã«å
¥ããŸãïŒ
function cyclepermks(pau_dur:Int64):Int64;
var tstsc,tetsc,p:Int64;
begin
p:=-10*pau_dur;
tstsc:=tsc;
NtDelayExecution(false,@p);
tetsc:=tsc-tstsc;
cyclepermks:=(tetsc-calibrate_runtime) *1000 div pau_dur;
end;
ãã®é¢æ°ã¯windows.pasããã®ä»ã®ãã¡ã€ã«ã«ç»é²ãããŠããªããããæ¬¡ã®è¡ã远å ããŠåŒã³åºããŸãã
procedure NtDelayExecution(Alertable:boolean;Interval:PInt64); stdcall; external 'ntdll.dll';
颿°ãåŒã³åºããŠçµæã®ããŒãã«ãäœæããã³ãŒãã¯ã次ã®ããã«ä¿®æ£ããå¿
èŠããããŸãïŒ
äŸ7ãåç
§ ïŒã
var test_result,temp_result:string; n:Int64; i:byte; aver,t_res:Int64; res:TextFile;
begin
WriteLn('The program will generate a file containing the table of results of measurements of quantity of cycles of the processor in a mikrosecond. Time of measurement is chosen'+' miscellaneous, intervals: 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000 mks. You will see distinctions of measurements. If an interval of measurement longer - results will be more exact.');
WriteLn;
Writeln('Expected time of check - 1 minute. Press any key for start of the test...');
temp_result:='Delay :'+#9+'Test 1:'+#9+'Test 2:'+#9+'Test 3:'+#9+'Test 4:'+#9+'Test 5:'+#9+'Average:';
n:=1;
test_result:=temp_result;
WriteLn(test_result);
while n<=10000000 do
begin
temp_result:='10^'+IntToStr(length(IntToStr(n))-1)+'mks'+#9;
aver:=0;
for i:=1 to 5 do
begin
t_res:=cyclepermks(n);
aver:=aver+t_res;
temp_result:=temp_result+IntToStr(t_res)+#9;
end;
WriteLn(temp_result+IntToStr(aver div 5));
test_result:=test_result+#13+#10+temp_result+IntToStr(aver div 5);
n:=n*10;
end;
WriteLn;
AssignFile(res,'TCC_NTAPI.xls');
ReWrite(res);
Write(res,test_result);
CloseFile(res);
WriteLn('The test is completed. The data are saved in a file TCC_NTAPI.xls.');
Writeln('Press any key for an exit...');
ReadLn;
end.
NtDelayExecutionã«ãã£ãŠäœæãããé
å»¶ã®èª¿æ»ã宿œããåŸãè峿·±ãçµæãåŸãããŸããã

1ããªç§æªæºã®ééã§ãã®é¢æ°ã«ãã®ãããªç²ŸåºŠãé©çšããããšã¯ç¡æå³ã§ããããšãããããŸãã ä»ã®é
å»¶ééã¯ãè§£å床ã倿Žããã«
ã¹ãªãŒãããããããããã«åªããŠããŸãããé«è§£å床ã§ã¹ãªãŒããããããæªãã§ãïŒããã¯ååãšããŠçè§£ã§ããŸãããªããªããããã§ã¯åªå
床ã®é«ããããŒãäœæãããããã«ãã
timeBeginPeriodã«ãªã
ãŸã ïŒã ãããŠã
timeBeginPeriodã远å ãã
ãš ïŒ äœãèµ·ãããèŠãŠã¿ãŸãããïŒ

ãã€ã¯ãç§ééã§ãç¶æ³ã¯åãã§ãã ãã ãã1ããªç§ããå§ãŸãééã§ã¯ã10ç§ã®å€ãšã®å·®ã¯0.84ïŒ
ã§ãããã¯ã¹ãªãŒãã®åæ§ã®äœ¿çšïŒ1.7ïŒ
ïŒãããåªããŠããŸã
-NtDelayExecutionã¯ããæ£ç¢ºã«é
å»¶ãäžããŸãã
ã³ãŒãå®è¡ã®é
å»¶ã«ã€ããŠããã°ã©ãã³ã°ããŒã«ãæ€çŽ¢ãããšãå¥ã®ãªãã·ã§ã³ãèŠã€ãããŸãã[
4 ]ãããã¯ããã€ã¯ãç§åäœã§ééãæå®ããæ©èœãæäŸããŠããããã§ãã ããã¯
WaitableTimerã§ãã
CreateWaitableTimer颿°
ãSetWaitableTimer颿°
ãWaitForSingleObjectEx颿°ã
䜿çšããŠæäœ
ã§ããŸãã
WaitableTimerã远å ãã
cyclepermksããã·ãŒãžã£ã®ãã¥ãŒïŒ
function cyclepermks(pau_dur:Int64):Int64;
var tstsc,tetsc,p:Int64; tmr:cardinal;
begin
tmr:=CreateWaitableTimer(nil, false, nil);
p:=-10*pau_dur;
tstsc:=tsc;
SetWaitableTimer(tmr, p, 0, nil, nil, false);
WaitForSingleObjectEx(tmr, infinite, true);
CloseHandle(tmr);
tetsc:=tsc-tstsc;
cyclepermks:=(tetsc-calibrate_runtime2) *1000 div pau_dur;
end;
WaitableTimerã䜿çšããããšã®
ç¹æ§ã«ããã
calibrate_runtimeã§ååŸããè£æ£ã®èšç®ã倿Žããå¿
èŠ
ããã
ãŸã ã
function calibrate_runtime2:Int64;
var i:byte; tstsc,tetsc,crtm, p:Int64; tmr:cardinal;
begin
tstsc:=tsc;
crtm:=tsc-tstsc;
for i:=0 to 9 do
begin
tmr:=CreateWaitableTimer(nil, false, nil);
p:=0;
tstsc:=tsc;
SetWaitableTimer(tmr, p, 0, nil, nil, false);
CloseHandle(tmr);
crtm:=tsc-tstsc;
if tetsc<crtm then crtm:=tetsc;
end;
calibrate_runtime2:=crtm;
end;
çµå±ã
SetWaitableTimerãš
CloseHandleããèæ
®ããŠããããã»ããµãŒã¯ããã¯æ°ã®æéå®è¡ãããŸãã
timeBeginPeriodåŒã³åºãã
cyclepermks ã³ãŒãã«ããã«è¿œå ãããã®æé ã粟床ã®åäžã«åœ¹ç«ã€ããšãæåŸ
ããŠããŸãïŒ
äŸ8ãåç
§ ïŒã çµæè¡šïŒ

æ®å¿µãªãããããã§ã¯ããªç§æªæºã®ééã«é
å»¶ãèšå®ããæ©äŒããããŸããã§ããã 1ããªç§ãš10ç§ã®å€ã®å·®ã¯5ïŒ
ã§ãã 以åã®æ¹æ³ãšæ¯èŒããŠãããã¯ããã«æªãã§ãã
çµè«ãåºãåã«ãæéãã®ãã®ã®å®éã®æž¬å®ã«ã€ããŠå°ã説æããŸãã äžèšã®ç ç©¶ã§ã¯ãæ¯èŒã®åºç€ã¯ããã»ããµãµã€ã¯ã«ã®æ°ã§ãããåã³ã³ãã¥ãŒã¿ã«ã¯ç°ãªããã®ããããŸãã ç§ã«åºã¥ããŠæéã®åäœã«å€æããå¿
èŠãããå Žåã¯ã次ãå®è¡ããå¿
èŠããããŸãïŒ
NtDelayExecution 10-second delayã䜿çšããŠããããã®10ç§éã®ããã»ããµãµã€ã¯ã«æ°ãååŸãããã1ãµã€ã¯ã«ã®æéã確èªããŸãïŒ
äŸ9ãåç
§ ïŒã åäœæéãããã®ããã»ããµãµã€ã¯ã«æ°ãããã£ãŠããå Žåãããã»ããµãµã€ã¯ã«æ°ã®å°ããå€ãæéå€ã«å®å
šã«å€æã§ããŸãã ããã«ãã¢ããªã±ãŒã·ã§ã³ã®ãªã¢ã«ã¿ã€ã åªå
床ãèšå®ããããšããå§ãããŸãã
ãããã« å®è¡ãããäœæ¥ã®çµæãã³ã³ãã¥ãŒã¿ãŒã§éåžžã«æ£ç¢ºã«æéãæž¬å®ã§ããããšãããããŸããïŒ50ããã»ããµãŒãµã€ã¯ã«ã§æšå®ãããæéãŸã§ïŒã ãã®åé¡ã¯æ£åžžã«è§£æ±ºãããŸããã å®è¡å¯èœã³ãŒãã®æ£ç¢ºãªé
å»¶ãåå¥ã«èšå®ããæ©èœã«é¢ããŠã¯ãç¶æ³ã¯æ¬¡ã®ãšããã§ãïŒæ€åºãããæè¯ã®æ¹æ³ã«ããã1ããªç§ä»¥äžã®è§£å床ã§ãããè¡ãããšãã§ãã1 msééã§çŽ0.84ïŒ
ã®è§£å床ãšã©ãŒãçºçããŸãã ããã¯ã
timeBeginIntervalããã·ãŒãžã£ã«ããã¢ã¯ã»ã¹èš±å¯ãèšå®ãã
NtDelayExecution颿°ã§ãã ãã®é¢æ°ã®æ¬ ç¹ã¯ã粟床ã®äœãã¹ãªãŒããšæ¯èŒããŠãé¢åãªåŒã³åºããšããã¥ã¡ã³ãåãããŠããªããã€ãã£ãAPIã®ååšã§ãã ãã€ãã£ãAPIã®äœ¿çšã¯ãWindowsãã¡ããªã®ç°ãªããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§åã
ã®APIã®éäºææ§ãçããå¯èœæ§ãããããããå§ãããŸããã äžè¬ã«ã
NtDelayExecution颿°ã®æãããªå©ç¹ã¯ã
äŸç¶ãšããŠæå©ãªéžæã匷å¶ããŸãã
äŸïŒ1.
ã·ã¹ãã ã¿ã€ããŒã®è§£ååºŠã®æ±ºå®2.
RDTSCåºå3.
ã¹ãªãŒããŸã§ã®ééãèšå®ããŸã4.
ããã»ããµã®åšæ³¢æ°ã調ã¹ã5.
ã¹ãªãŒãã®ééãããæ£ç¢ºã«èšå®ãã6.
ã¹ãªãŒãäžã®ééãç°ãªãå€ã«èšå®ãã粟床ã調æ»ããŸã7.
NtDelayExecutionã䜿çšããéé8.
WaitableTimerã䜿çšããéé9.
1ããã»ããµãµã€ã¯ã«ã®æéã調ã¹ãäŸã«ã¯ããœãŒã¹ã³ãŒã* .dprãã¡ã€ã«ïŒDelphiã®å ŽåïŒãã³ã³ãã€ã«ãããã³ã³ãœãŒã«* .exeã¢ããªã±ãŒã·ã§ã³ãããã³ïŒMS Excelã§ãµããŒããããŠãã圢åŒã®ïŒäœæè
ãæ¢ã«ååŸããçµæã®* .xlsããŒãã«ãå«ãŸããŸãã ãã¹ãŠã®äŸã¯1ã€ã®ãã¡ã€ã«ã«åããããŠããŸã ãåç
§ïŒ1. Russinovich M.ãSolomon D.å
éšããã€ã¹Microsoft Windowsã -ãµã³ã¯ãããã«ãã«ã¯ïŒããŒã¿ãŒã2005幎-992 pã
2. Schupak Yu.A. Win32 APIã 广çãªã¢ããªã±ãŒã·ã§ã³éçºã -ãµã³ã¯ãããã«ãã«ã¯ïŒããŒã¿ãŒã2007幎-572 pã
3. RDTSC-ãŠã£ãããã£ã¢[
http://ru.wikipedia.org/wiki/Rdtsc ]
4. CreateWaitableTimer-MSDN [
http://msdn.microsoft.com/en-us/library/ms682492(VS.85).aspx ]
5. NtDelayExecution-RealCoding [
http://forums.realcoding.net/lofiversion/index.php/t16146.html ]
ãã®èšäºã¯
2009幎 11æ13æ¥ã«
begin_endã«ãã£ãŠæžã
ããŸãã ã èè
ã¯ãèšäºã§èæ
®ãããããã€ãã®ãã€ã³ãã
sleshãšè°è«ããŸããã