ã€ãŸããããããã»ã¹ããtimeBeginPeriodãåŒã³åºããšãä»ã®ããã»ã¹ãžã®åœ±é¿ã¯ä»¥åãããå°ãªããªããŸããããã®åœ±é¿ã¯ãŸã ååšããŸãã
æ°ããåäœã¯æ¬è³ªçã«æ¹åããããã®ã ãšæããŸãããããã¯å¥åŠã§ãããææžåãã䟡å€ããããŸããæ£çŽãªãšãããç§ã¯ããªãã«èŠåããŸã-ç§ã¯èªåã®å®éšã®çµæããæã£ãŠããªãã®ã§ããã®å€æŽã®ç®æšãšããã€ãã®å¯äœçšã«ã€ããŠããæšæž¬ã§ããŸãããç§ã®èª¿æ»çµæã®ãããããæ£ãããªãå Žåã¯ãç§ã«ç¥ãããŠãã ããã
ã¿ã€ããŒã®äžæãšãã®çç±
ãŸãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®èšèšã«ã€ããŠå°ã説æããŸããããã°ã©ã ãç ãã«èœã¡ãåŸã§ç®ãèŠãŸãããšãã§ããããšãæãŸãããå®éãããã¯ããŸãé »ç¹ã«è¡ãã¹ãã§ã¯ãããŸãã-ã¹ã¬ããã¯éåžžãã¿ã€ããŒã§ã¯ãªãã€ãã³ããåŸ æ©ããŸã-ããããå¿ èŠãªå ŽåããããŸãããããã£ãŠãWindowsã«ã¯ã¹ãªãŒãæ©èœ ããããŸããå¿ èŠãªã¹ãªãŒãæéãããªç§åäœã§æž¡ããšãããã»ã¹ããŠã§ã€ã¯ã¢ããããŸãã
ã¹ãªãŒãïŒ1ïŒ;
ãããã©ã®ããã«å®è£ ãããŠããããæ€èšãã䟡å€ããããŸããçæ³çã«ã¯ãSleepïŒ1ïŒãåŒã³åºããããšãããã»ããµã¯ã¹ãªãŒãç¶æ ã«ãªããŸããããããããã»ããµãã¹ãªãŒãç¶æ ã®å Žåããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ã©ã®ããã«ã¹ã¬ããããŠã§ã€ã¯ã¢ããããŸããïŒçãã¯ããŒããŠã§ã¢å²ã蟌ã¿ã§ãã OSã¯ãããïŒããŒããŠã§ã¢ã¿ã€ããŒïŒãããã°ã©ã ããŸããããŒããŠã§ã¢ã¿ã€ããŒã¯ãããã»ããµããŠã§ã€ã¯ã¢ããããå²ã蟌ã¿ãããªã¬ãŒããOSã¯ã¹ã¬ãããéå§ããŸãã
WaitForSingleObjecté¢æ°ãšWaitForMultipleObjectsé¢æ°ã«ãã¿ã€ã ã¢ãŠãå€ãããããããã®ã¿ã€ã ã¢ãŠãã¯åãã¡ã«ããºã ã䜿çšããŠå®è£ ãããŸãã
ã¿ã€ããŒãåŸ æ©ããŠããã¹ã¬ãããå€æ°ããå ŽåãOSã¯ã¹ã¬ããããšã«åå¥ã®æéã«ããŒããŠã§ã¢ã¿ã€ããŒãããã°ã©ã ã§ããŸãããããã¯éåžžãã¹ã¬ãããã©ã³ãã ãªæéã«ãŠã§ã€ã¯ã¢ããããããã»ããµãæ£åžžã«ã¹ãªãŒãããªããšããäºå®ã«ã€ãªãããŸãã CPUã®é»åå¹çã¯ãã¹ãªãŒãæéïŒéåžžã®æéã¯8msïŒã«å€§ããäŸåããã©ã³ãã ãŠã§ã€ã¯ã¯ããã«å¯äžããŸãããè€æ°ã®ã¹ã¬ãããã¿ã€ããŒã®æåŸ å€ãåæãŸãã¯ããŒã«ãããšãã·ã¹ãã ã®ãšãã«ã®ãŒå¹çãåäžããŸãã
ãŠã§ã€ã¯ãçµã¿åãããæ¹æ³ã¯ãããããããŸãããWindowsã®äž»ãªã¡ã«ããºã ã¯ãäžå®ã®é床ã§å»ã ãšå€åããã¿ã€ããŒãã°ããŒãã«ã«äžæããããšã§ããã¹ã¬ãããSleepïŒnïŒãåŒã³åºããšãOSã¯æåã®ã¿ã€ããŒå²ã蟌ã¿ã®çŽåŸã«ã¹ã¬ãããéå§ããããã«ã¹ã±ãžã¥ãŒã«ããŸããã€ãŸããã¹ã¬ããã¯å°ãé ããŠãŠã§ã€ã¯ã¢ããããå¯èœæ§ããããŸãããWindowsã¯ãªã¢ã«ã¿ã€ã OSã§ã¯ãªããç¹å®ã®ãŠã§ã€ã¯ã¢ããæéãä¿èšŒãããã®ã§ã¯ãããŸããïŒãã®æç¹ã§ã¯ããã»ããµã³ã¢ãããžãŒã§ããå¯èœæ§ããããŸãïŒããããã£ãŠãå°ãé ããŠãŠã§ã€ã¯ã¢ããããã®ã¯ããæ®éã®ããšã§ãã
ã¿ã€ããŒå²ã蟌ã¿ã®ééã¯ãWindowsãšããŒããŠã§ã¢ã®ããŒãžã§ã³ã«ãã£ãŠç°ãªããŸããããã¹ãŠã®ãã·ã³ã§ããã©ã«ãã§15.625msïŒ1000ms / 64ïŒã«ãªã£ãŠããŸããããã¯ãSleepïŒ1ïŒãåŒã³åºããšããã©ã³ãã ãªæéã«ã次ã®ã°ããŒãã«ã¿ã€ããŒå²ã蟌ã¿ãããªã¬ãŒããããšãïŒãŸãã¯æ©ãããå Žåã¯1ååŸïŒãããã»ã¹ã¯å°æ¥1.0msãã16.625msã®éã®ã©ããã§ãŠã§ã€ã¯ã¢ãããããŸãã
ã€ãŸããã¿ã€ããŒé 延ã®æ§è³ªã¯ãïŒããã»ããµãŒã®ã¢ã¯ãã£ãåŸ æ©ã䜿çšãããŠããå Žåãé€ãã䜿çšããªãã§ãã ããïŒãOSã¯ã¿ã€ããŒå²ã蟌ã¿ã䜿çšããŠç¹å®ã®æéã«ã®ã¿ã¹ã¬ããããŠã§ã€ã¯ã¢ããã§ããWindowsã¯éåžžã®å²ã蟌ã¿ã䜿çšããŸãã
äžéšã®ããã°ã©ã ïŒWPFãSQL ServerãQuartzãPowerDirectorãChromeãGo Runtimeãå€ãã®ã²ãŒã ãªã©ïŒã§ã¯ãåŸ ã¡æéã«ããã»ã©å€§ããªã°ãã€ãã¯ãããŸããã幞ããtimeBeginPeriodé¢æ°ã§åé¡ãä¿®æ£ã§ããŸãããã«ãããããã°ã©ã ã¯ããçãééãèŠæ±ã§ããŸããééã1ããªç§æªæºã«èšå®ã§ããNtSetTimerResolutioné¢æ°ããããŸããã䜿çšãããããšã¯ãã£ãã«ãªããå¿ èŠã«ãªãããšããªããããããã§ã¯å床説æããŸããã
çæ°ã®æ°å幎
ããã¯ããããªããšã§ããtimeBeginPeriodã¯ã©ã®ããã°ã©ã ããã§ãåŒã³åºãããšãã§ããã¿ã€ããŒå²ã蟌ã¿ééãå€æŽããŸããã¿ã€ããŒå²ã蟌ã¿ã¯ã°ããŒãã«ãªãœãŒã¹ã§ãã
ããã»ã¹AãSleepïŒ1ïŒã®åŒã³åºããšã«ãŒãããŠãããšæ³åããŠã¿ãŸããããããã¯ééã£ãŠããŸãããããã§ãããããã©ã«ãã§ã¯ã15.625msããšãã€ãŸã1ç§éã«64åãŠã§ã€ã¯ã¢ããããŸãã次ã«ãããã»ã¹Bãå ¥ããtimeBeginPeriodïŒ2ïŒãåŒã³åºããŸããããã«ãããã¿ã€ããŒãããé »ç¹ã«èµ·åããããã»ã¹Aãæ¯ç§64åã§ã¯ãªããæ¯ç§500åãŠã§ã€ã¯ã¢ããããŸããããã¯çæ°ã§ãïŒããããããã¯Windowsãåžžã«æ©èœããŠããæ¹æ³ã§ãã
ãã®æç¹ã§ãããã»ã¹Cã衚瀺ãããtimeBeginPeriodïŒ4ïŒãåŒã³åºãããå Žåãããã¯äœãå€æŽããŸãã-ããã»ã¹Aã¯1ç§éã«500åãŠã§ã€ã¯ã¢ãããç¶ããŸãããã®ãããªç¶æ³ã§ã¯ãã«ãŒã«ãèšå®ããã®ã¯æåŸã®åŒã³åºãã§ã¯ãªããæå°ééã®åŒã³åºãã§ãã
ãããã£ãŠãå®è¡äžã®ããã°ã©ã ããtimeBeginPeriodãåŒã³åºããšãã°ããŒãã«ã¿ã€ããŒã®å²ã蟌ã¿ééãèšå®ã§ããŸãããã®ããã°ã©ã ãçµäºããããtimeEndPeriodãåŒã³åºããšãæ°ããæå°å€ãæå¹ã«ãªããŸãã 1ã€ã®ããã°ã©ã ãtimeBeginPeriodïŒ1ïŒãåŒã³åºãå Žåãããã¯ã·ã¹ãã å šäœã®ã¿ã€ããŒå²ã蟌ã¿ééã«ãªããŸãã 1ã€ã®ããã°ã©ã ãtimeBeginPeriodïŒ1ïŒãåŒã³åºããå¥ã®ããã°ã©ã ãtimeBeginPeriodïŒ4ïŒãåŒã³åºãå Žåã1ããªç§ã®ã¿ã€ããŒå²ã蟌ã¿ééã¯æ®éçãªæ³åã«ãªããŸãã
ããã§èª¬æããããã«ãé«ãã¿ã€ããŒå²ã蟌ã¿ã¬ãŒãïŒããã³ããã«é¢é£ããé«ãã¹ã¬ããã¹ã±ãžã¥ãŒãªã³ã°ã¬ãŒãïŒã¯ãCPUãã¯ãŒãå€§å¹ ã«æµªè²»ããå¯èœæ§ããããããããã¯éèŠã§ãã
ã¿ã€ããŒããŒã¹ã®ã¹ã±ãžã¥ãŒãªã³ã°ãå¿ èŠãªã¢ããªã±ãŒã·ã§ã³ã®1ã€ã¯ãWebãã©ãŠã¶ãŒã§ãã JavaScriptæšæºã«ã¯ãæ°ããªç§åŸã«JavaScripté¢æ°ãåŒã³åºãããã«ãã©ãŠã¶ãŒã«èŠæ±ããsetTimeouté¢æ°ããããŸãã Chromiumã¯ã¿ã€ããŒã䜿çšããŠããã®æ©èœããã®ä»ã®æ©èœãå®è£ ããŸãïŒåºæ¬çã«ãSleepã§ã¯ãªãã¿ã€ã ã¢ãŠãä»ãã®WaitForSingleObjectïŒãå€ãã®å Žåãããã«ã¯ã¿ã€ããŒã®å²ã蟌ã¿çãäžããå¿ èŠããããŸããããããªãŒå¯¿åœãäœãä¿ã€ããã«ãChromiumã¯æè¿ãããããªãŒé»æºã§ã¿ã€ããŒå²ã蟌ã¿ã¬ãŒãã125 HzïŒ8msééïŒæªæºã«ä¿ã€ããã«åèšèšãããŸããã
timeGetTime
timeGetTime é¢æ°ïŒGetTickCountãšæ··åããªãã§ãã ããïŒã¯ãã¿ã€ããŒå²ã蟌ã¿ã«ãã£ãŠæŽæ°ãããçŸåšã®æå»ãè¿ããŸããããã»ããµã¯ãæŽå²çã«æ£ç¢ºãªæå»ãç¶æããã®ãããŸãåŸæã§ã¯ãããŸããã§ããïŒFMéä¿¡æ©ãšããŠã®æ©èœãåé¿ããããã«ãããã³ãã®ä»ã®çç±ã§ããããã®ã¯ããã¯ã¯æå³çã«æ¯åããŸãïŒããã®ãããCPUã¯ãæ£ç¢ºãªæå»ãç¶æããããã«å¥åã®ã¯ããã¯ãžã§ãã¬ãŒã¿ã«äŸåããããšããããããŸãããããã®ãããããã®èªã¿åãã«ã¯ã³ã¹ããããããããWindowsã¯ã¿ã€ããŒå²ã蟌ã¿ã§æŽæ°ããã64ãããããªç§ã«ãŠã³ã¿ãŒãç¶æããŸãããã®ã¿ã€ããŒã¯å ±æã¡ã¢ãªã«ä¿åããããããã©ã®ããã»ã¹ã§ããæèšã«è¡ããªããŠããããããçŸåšã®æå»ãå®äŸ¡ã«èªã¿åãããšãã§ããŸããtimeGetTimeã¯ReadInterruptTickãåŒã³åºããŸããããã¯ãåºæ¬çã«ãã®64ãããã«ãŠã³ã¿ãŒãèªã¿åãã ãã§ãããšãŠãç°¡åã§ãïŒ
ã«ãŠã³ã¿ã¯ã¿ã€ããŒå²ã蟌ã¿ã«ãã£ãŠæŽæ°ããããããããã远跡ããŠã¿ã€ããŒå²ã蟌ã¿é »åºŠãèŠã€ããããšãã§ããŸãã
ææžåãããŠããªãæ°ããçŸå®
Windows 10 2004ã®ãªãªãŒã¹ïŒ2020幎4æïŒã«ããããããã®ã¡ã«ããºã ã®äžéšããããã«å€æŽãããŸããããéåžžã«çŽããããæ¹æ³ã§ãããŸããtimeBeginPeriodãæ©èœããªããªã£ããšããã¡ãã»ãŒãžããããŸãããå®éããã¹ãŠãã¯ããã«è€éã§ããããšãå€æããŸããã
æåã®å®éšã§ã¯ãããŸããŸãªçµæãåŸãããŸãããtimeBeginPeriodïŒ2ïŒãåŒã³åºããŠããã°ã©ã ãå®è¡ãããšãclockresã¯2.0msã®ã¿ã€ããŒééã瀺ããŸããããSleepïŒ1ïŒã«ãŒããåããå¥ã®ãã¹ãããã°ã©ã ã¯ã以åã®ããŒãžã§ã³ã®Windowsã®500åã§ã¯ãªãã1ç§ãããçŽ64åèµ·åããŸããã
ç§åŠå®éš
次ã«ãã·ã¹ãã ã®åäœãç 究ããããã®ããã°ã©ã ãããã€ãäœæããŸããã1ã€ã®ããã°ã©ã ïŒchange_interval.cppïŒã¯ã«ãŒãå ã«ããã1ã15ããªç§ã®ééã§timeBeginPeriodãåŒã³åºããŸãã圌女ã¯åééã4ç§éä¿æããŠããã次ã®ééã«ç§»åããŸãã15è¡ã®ã³ãŒããç°¡åã
å¥ã®ããã°ã©ã ïŒmeasure_interval.cppïŒã¯ãchange_interval.cppãå€æŽããããšãã«ãã®åäœãã©ã®ããã«å€åãããã確èªããããã«ãããã€ãã®ãã¹ããå®è¡ããŸããããã°ã©ã ã¯3ã€ã®ãã©ã¡ãŒã¿ãç£èŠããŸãã
- 圌女ã¯OSã«ãNtQueryTimerResolutionã䜿çšããŠããã°ããŒãã«ã¿ã€ããŒã®çŸåšã®è§£å床ãå°ããŸãã
- timeGetTime, , â , .
- Sleep(1), . .
@FelixPetriconiã¯Windows10 1909ã§ãã¹ããå®è¡ããWindows 10 2004ã§ãã¹ããå®è¡ããŸããããžãã¿ã®ãªãçµæã¯æ¬¡ã®ãšããã§ãã
ããã¯ãtimeBeginPeriodããã¹ãŠã®WindowsããŒãžã§ã³ã§ã°ããŒãã«ã¿ã€ããŒééãèšå®ããããšãæå³ããŸããtimeGetTimeïŒïŒã®çµæãããå°ãªããšã1ã€ã®ããã»ããµã³ã¢ã§ãã®ã¬ãŒãã§å²ã蟌ã¿ãããªã¬ãŒãããæå»ãæŽæ°ãããŠãããšèšããŸãã 1909幎ã®æåã®è¡ã®2.0ãWindowsXPã§ã¯2.0ã次ã«Windows 7/8ã§ã¯1.0ã§ããããåã³2.0ã«æ»ã£ãããã§ãã
ãã ããWindows 10 2004ã§ã¯ãã¹ã±ãžã¥ãŒãªã³ã°ã®åäœãå€§å¹ ã«å€æŽãããŸãã以åã¯ãã¹ãªãŒãã®é 延ïŒ1ïŒtimeBeginPeriodïŒ1ïŒãé€ããŠãã©ã®ããã»ã¹ã§ãã¿ã€ããŒã®å²ã蟌ã¿ééãšåãã§ã次ã®ãããªã°ã©ãã衚瀺ãã
ãŸããWindows10 2004ã§ã¯ãtimeBeginPeriodãšå¥ã®ããã»ã¹ïŒtimeBeginPeriodãåŒã³åºããªãã£ãïŒã®ã¹ãªãŒãã¬ã€ãã³ã·ãšã®é¢ä¿ã¯å¥åŠã«èŠã
ãŸããã°ã©ãã®å·ŠåŽã®æ£ç¢ºãªåœ¢ç¶ã¯äžæã§ãããããã¯ééããªãåã®ãã®ãšã¯å察ã®æ¹åã«é²ã¿ãŸãïŒ
ã©ãããŠïŒ
å¹æ
redditãšhacker-newsã®è°è«ã§ææãããŠããããã«ãã°ããŒãã«ã¿ã€ããŒå²ã蟌ã¿ã®å©çšå¯èœãªç²ŸåºŠãèãããšãã°ã©ãã®å·Šååã¯ãéåžžã®ãé 延ãå¯èœãªéãæš¡å£ããããšããŠããå¯èœæ§ããããŸããã€ãŸãã6ããªç§ã®å²ã蟌ã¿ééã§ã¯ãé 延ã¯çŽ12ããªç§ïŒ2ãµã€ã¯ã«ïŒçºçãã7ããªç§ã®å²ã蟌ã¿ééã§ã¯ãçŽ14ããªç§ïŒ2ãµã€ã¯ã«ïŒé 延ããŸãããã ããå®éã®é 延ã枬å®ãããšãçŸå®ã¯ããã«æ··ä¹±ããããšãããããŸããã¿ã€ããŒå²ã蟌ã¿ã7msã«èšå®ãããŠããå Žåã14msã®ã¹ãªãŒãïŒ1ïŒåŸ ã¡æéã¯ãæãäžè¬çãªçµæã§ã¯ãããŸããã
äžéšã®ãªãŒããŒã¯ãã·ã¹ãã ã®ã©ã³ãã ãã€ãºãéé£ããå ŽåããããŸãããã¿ã€ããŒå²ã蟌ã¿ã¬ãŒãã9ms以äžã®å Žåããã€ãºã¯ãŒãã§ãããããããã§ã¯ãããŸããã説æãããããŸãããæŽæ°ããã³ãŒããèªåã§å®è¡ããŠã¿ãŠãã ããã 4msãã8msãŸã§ã®ã¿ã€ããŒå²ã蟌ã¿ééã¯ç¹ã«ç©è°ãéžããŠããããã§ããçŸåšã®ã³ãŒãã¯ã¹ã±ãžã¥ãŒãªã³ã°ã«ãŒã«ã®å€æŽãšã¿ã€ããŒã®ç²ŸåºŠã®å€æŽã«ãã£ãŠã©ã³ãã ã«åœ±é¿ãåãããããééã®æž¬å®ã¯ããããQueryPerformanceCounterã䜿çšããŠå®è¡ããå¿ èŠããããŸãã
ããã¯ãã¹ãŠéåžžã«å¥åŠã§ãããžãã¯ãå®è£ ãããããŸãããããã¯ééããããããŸããããç§ã¯ãããçã£ãŠããŸãããã®èåŸã«ã¯è€éãªåŸæ¹äºææ§ããžãã¯ããããšæããŸãããã ããäºææ§ã®åé¡ãåé¿ããæãå¹æçãªæ¹æ³ã¯ãã§ããã°äºåã«å€æŽãææžåããããšã§ããããã§ã¯ãéç¥ãªãã«ç·šéãè¡ãããŸãã
ããã¯ã»ãšãã©ã®ããã°ã©ã ã«åœ±é¿ããŸãããããã»ã¹ãããé«éãªã¿ã€ããŒäžæãå¿ èŠãšããå Žåã¯ãtimeBeginPeriodèªäœãåŒã³åºãå¿ èŠããããŸãã..ããã ãã次ã®åé¡ãçºçããå¯èœæ§ããããŸãã
- ããã°ã©ã ã¯ãSleepïŒ1ïŒãštimeGetTimeã®è§£å床ãåãã§ãããšèª€ã£ãŠæ³å®ããå¯èœæ§ããããŸãããããã¯ãã¯ãåœãŠã¯ãŸããŸããããããããã®ãããªä»®å®ã¯ããããããªãããã§ãã
- , . â Windows System Timer Tool TimerResolution 1.2. «» , . , . , , .
- , , . , . . , , timeBeginPeriod , , .
change_interval.cpp ãã¹ãããã°ã©ã ã¯ã誰ãããé«ãã¿ã€ããŒå²ã蟌ã¿ã¬ãŒããèŠæ±ããªãå Žåã«ã®ã¿æ©èœããŸããChromeãšVisualStudioã¯ã©ã¡ãããããè¡ãç¿æ £ããããããã€ã³ã¿ãŒãããã«ã¢ã¯ã»ã¹ãããã¡ã¢åž³ã«ã³ãŒãã£ã³ã°ãããããã«ãã»ãšãã©ã®å®éšãè¡ãå¿ èŠããããŸããã誰ããEmacsãææ¡ããŸãããããã®è°è«ã«åå ããããšã¯ç§ã®åãè¶ ããŠããŸãã