ããããå€ãã®äººãç¥ã£ãŠããããã«ã
ã¹ãªãŒãç¶æ
ã«ãããããªç§æ°ã¯ãWinAPIã®
Sleepé¢æ°ã«æž¡ãããŸãã ãããã£ãŠãèŠæ±ã§ããæå°å€ã¯1ããªç§éã¹ãªãŒãç¶æ
ã«ãªããŸãã ããããããã«ç¡ç ãæžããããå Žåã¯ã©ãã§ããããïŒ
åçã§ãããè¡ãæ¹æ³ã«èå³ããã人ã¯ãç«ã®äžã§æè¿ããŸãã
ãŸããWindowsã¯ïŒä»ã®éãªã¢ã«ã¿ã€ã ã·ã¹ãã ãšåæ§ã«ïŒã¹ã¬ããïŒã¹ã¬ãããšåŒã°ããããšãããïŒãèŠæ±ãããæéã«æ£ç¢ºã«ã¹ãªãŒãããããšãä¿èšŒããªãããšãæãåºããŸãã Vista以éãOSã®ããžãã¯ã¯åçŽã§ãã å®è¡ã®ããã«ã¹ã¬ããã«å²ãåœãŠãããäžå®ã®æéããããŸãïŒã¯ããã¯ãã2000 / XPã®éã«èª°ããèããã®ãšåã20ããªç§ã§ãããããã§ããµãŒããŒã®è»žã§ãããèããŸãïŒ ãŸããWindowsã¯ããã®ã¯ã©ã³ã¿ã ãæéåãã«ãªã£ãåŸã«ã®ã¿ãã¹ã¬ãããåã¹ã±ãžã¥ãŒã«ïŒäžéšã®ã¹ã¬ãããåæ¢ãä»ã®ã¹ã¬ãããéå§ïŒããŸãã ã€ãŸã OSã®ã¯ã©ã³ã¿ã ã20ããªç§ïŒXPã®ããã©ã«ãã¯ãã®ãããªå€ãªã©ïŒã§ããå Žåã
ã¹ãªãŒãïŒ1ïŒãèŠæ±ãããšããŠããææªã®å Žåãåã20ããªç§åŸã«å¶åŸ¡ãè¿ãããŸãã ãã®æé
åäœ ãç¹ã«
timeBeginPeriod / timeEndPeriodã管çããããã®ãã«ãã¡ãã£ã¢æ©èœããããŸãã
第äºã«ããã®ãããªæ£ç¢ºããå¿
èŠãªçç±ãç°¡åã«èª¬æããŸãã Microsoftã¯ããã®ãããªç²ŸåºŠãå¿
èŠãªã®ã¯ãã«ãã¡ãã£ã¢ã¢ããªã±ãŒã·ã§ã³ã ãã ãšèšããŸãã ããšãã°ãblackjetã䜿çšããŠæ°ããWinAMPãäœæããŸããããã§ã¯ãæ°ãããªãŒãã£ãªããŒã¿ãæééãã«ã·ã¹ãã ã«éä¿¡ããããšãéåžžã«éèŠã§ãã ç§ã®ããŒãºã¯å¥ã®åéã«ãããŸããã H264ã¹ããªãŒã ãã³ã³ãã¬ããµãŒããããŸããã ãããŠåœŒã¯ffmpeg'eã«ããã ãããŠã圌ã¯åæã€ã³ã¿ãŒãã§ãŒã¹ïŒFrame * decompressor.DecompressïŒFrame * compressedFrameïŒïŒãæã£ãŠããŸããã ãããŠãããã»ããµã®Intelãããã§è§£åãè¡ããŸã§ããã¹ãŠãé 調ã§ããã ã¡ãªã¿ã«ããã€ãã£ãIntel Media SDKã§ã¯ãªããDXVA2ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠäœæ¥ããå¿
èŠããã£ãçç±ãèŠããŠããŸããã ãããŠãããã¯éåæã§ãã ã ããç§ã¯ãã®ããã«åããªããã°ãªããŸããã§ããïŒ
- ããŒã¿ããããªã¡ã¢ãªã«ã³ããŒãã
- ãã¬ãŒã ããªã©ãã¯ã¹ããæéãæã€ããã«ãã¹ãªãŒãç¶æ
ã«ããŸã
- 解åãå®äºãããã©ããã確èªããå®äºããŠããå Žåã¯ããããªã¡ã¢ãªããæ¡åŒµãã¬ãŒã ãååŸããŸã
åé¡ã¯2çªç®ã®æ®µèœã«ãããŸããã GPUViewãä¿¡ããŠããå Žåããã¬ãŒã ã«ã¯50ã200ãã€ã¯ãç§ã§è§£åããæéããããŸããã
SleepïŒ1ïŒãèšå®ãããšãã³ã¢i5ã§æ倧1000 * 4 *ïŒã³ã¢ïŒ= 4000ãã¬ãŒã /ç§ã解åã§ããŸãã éåžžã®fpsã25ã«çãããšèãããšãããã¯åæã«40 * 4 = 160ã®ãããªã¹ããªãŒã ã®ã¿ã解åããŸãã ãããŠç®æšã¯200ãåŒãåºãããšã§ãããå®éã«ã¯2ã€ã®ãªãã·ã§ã³ããããŸãããããŒããŠã§ã¢ã³ã³ãã¬ããµãŒã䜿çšããŠéåææäœã®ããã«ãã¹ãŠãããçŽãããã¹ãªãŒãæéãççž®ãããã§ãã
æåã®æž¬å®
çŸåšã®å®è¡æã®ã¯ã©ã³ã¿ã ãæŠç®ããããã«ãç°¡åãªããã°ã©ã ãäœæããŸãã
void test() { std::cout << "Starting test" << std::endl; std::int64_t total = 0; for (unsigned i = 0; i < 5; ++i) { auto t1 = std::chrono::high_resolution_clock::now(); ::Sleep(1); auto t2 = std::chrono::high_resolution_clock::now(); auto elapsedMicrosec = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count(); total += elapsedMicrosec; std::cout << i << ": Elapsed " << elapsedMicrosec << std::endl; } std::cout << "Finished. average time:" << (total / 5) << std::endl; } int main() { test(); return 0; }
Win 8.1ã®å
žåçãªåºåã次ã«ç€ºããŸãéå§ãã¹ã
0ïŒ1977幎ã®çµé
1ïŒçµé1377
2ïŒçµé1409
3ïŒçµé1396
4ïŒçµé1432
å®æãã å¹³åæéïŒ1518
ããã«ãããšãã°MSVS 2012ãããå Žåãstd :: chrono :: high_resolution_clockã䜿çšããã€ããã¯ãªãããšãèŠåããŸãã ãšã«ãããäœãã®ç¶ç¶æéã枬å®ããæã確å®ãªæ¹æ³ã¯ãããã©ãŒãã³ã¹ã«ãŠã³ã¿ãŒã䜿çšããããšã§ãã ã³ãŒããå°ãæžãçŽããŠãæ£ããæéã枬å®ããŠããããšã確èªããŸãã æåã«ãã¯ã©ã¹ãã«ããŒãèšè¿°ããŸãã
ç§ã¯çŸåšMSVS2015ã§ãã¹ããè¡ããŸããããããã§ã¯high_resolution_clockã®å®è£
ã¯ããã©ãŒãã³ã¹ã«ãŠã³ã¿ãŒãéããŠæ¢ã«æ£ããã§ãã ç§ã¯ãã®ã¹ãããããã£ãŠãããçªç¶èª°ããå€ãã³ã³ãã€ã©ã§ãã¹ããç¹°ãè¿ãããPreciseTimer.h #pragma once class PreciseTimer { public: PreciseTimer(); std::int64_t Microsec() const; private: LARGE_INTEGER m_freq;
å€æŽããããã¹ãæ©èœ void test() { PreciseTimer timer; std::cout << "Starting test" << std::endl; std::int64_t total = 0; for (unsigned i = 0; i < 5; ++i) { auto t1 = timer.Microsec(); ::Sleep(1); auto t2 = timer.Microsec(); auto elapsedMicrosec = t2 - t1; total += elapsedMicrosec; std::cout << i << ": Elapsed " << elapsedMicrosec << std::endl; } std::cout << "Finished. average time:" << (total / 5) << std::endl; }
ããŠãWindows Server 2008 R2ã§ã®ããã°ã©ã ã®å
žåçãªåºåéå§ãã¹ã
0ïŒçµé10578
1ïŒçµé14519
2ïŒçµé14592
3ïŒçµé14625
4ïŒçµé14354
å®æãã å¹³åæéïŒ13733
é¡ã®åé¡ã解決ããããšããŠããŸã
ããã°ã©ã ãå°ãæžãçŽããŸãã ãããŠãæçœãªãã®ã䜿çšããŠã¿ãŠãã ããïŒ
std :: this_thread :: sleep_forïŒstd ::ã¯ãã::ãã€ã¯ãç§ïŒ500ïŒïŒ void test(const std::string& description, const std::function<void(void)>& f) { PreciseTimer timer; std::cout << "Starting test: " << description << std::endl; std::int64_t total = 0; for (unsigned i = 0; i < 5; ++i) { auto t1 = timer.Microsec(); f(); auto t2 = timer.Microsec(); auto elapsedMicrosec = t2 - t1; total += elapsedMicrosec; std::cout << i << ": Elapsed " << elapsedMicrosec << std::endl; } std::cout << "Finished. average time:" << (total / 5) << std::endl; } int main() { test("Sleep(1)", [] { ::Sleep(1); }); test("sleep_for(microseconds(500))", [] { std::this_thread::sleep_for(std::chrono::microseconds(500)); }); return 0; }
Windows 8.1ã§ã®å
žåçãªåºåéå§ãã¹ãïŒã¹ãªãŒãïŒ1ïŒ
0ïŒçµé1187
1ïŒçµé1315
2ïŒçµé1427
3ïŒçµé1432
4ïŒçµé1449
å®æãã å¹³åæéïŒ1362
éå§ãã¹ãïŒsleep_forïŒãã€ã¯ãç§ïŒ500ïŒïŒ
0ïŒçµéãã1297
1ïŒçµé1434
2ïŒçµé1280
3ïŒçµé1451
4ïŒçµé1459
å®æãã å¹³åæéïŒ1384
ã€ãŸã ã芧ã®ãšããã移åäžã®ã²ã€ã³ã¯ãããŸããã
this_thread :: sleep_forãããèŠãŠ
ãã ãã ã ãããŠãäžè¬çã«
this_thread :: sleep_until ãã€ãŸã
ã¹ãªãŒããšã¯ç°ãªã
ã圌ã¯ãäŸãã°ãæèšã®åœ±é¿ãåããŸããã æè¯ã®ä»£æ¿æ¡ãèŠã€ããŠã¿ãŸãããã
ã§ããã¹ãªãã
MSDNãšstackoverflowãæ€çŽ¢ãããšãå¯äžã®ä»£æ¿æ段ãšããŠåŸ
æ©å¯èœãªã¿ã€ããŒã«å°ãããŸãã ããŠãå¥ã®ãã«ããŒã¯ã©ã¹ãäœæããŸãããã
WaitableTimer.h #pragma once class WaitableTimer { public: WaitableTimer() { m_timer = ::CreateWaitableTimer(NULL, FALSE, NULL); if (!m_timer) throw std::runtime_error("Failed to create waitable time (CreateWaitableTimer), error:" + std::to_string(::GetLastError())); } ~WaitableTimer() { ::CloseHandle(m_timer); m_timer = NULL; } void SetAndWait(unsigned relativeTime100Ns) { LARGE_INTEGER dueTime = { 0 }; dueTime.QuadPart = static_cast<LONGLONG>(relativeTime100Ns) * -1; BOOL res = ::SetWaitableTimer(m_timer, &dueTime, 0, NULL, NULL, FALSE); if (!res) throw std::runtime_error("SetAndWait: failed set waitable time (SetWaitableTimer), error:" + std::to_string(::GetLastError())); DWORD waitRes = ::WaitForSingleObject(m_timer, INFINITE); if (waitRes == WAIT_FAILED) throw std::runtime_error("SetAndWait: failed wait for waitable time (WaitForSingleObject)" + std::to_string(::GetLastError())); } private: HANDLE m_timer; };
ãããŠãæ°ãããã¹ããè¿œå ããŸãïŒ
int main() { test("Sleep(1)", [] { ::Sleep(1); }); test("sleep_for(microseconds(500))", [] { std::this_thread::sleep_for(std::chrono::microseconds(500)); }); WaitableTimer timer; test("WaitableTimer", [&timer] { timer.SetAndWait(5000); }); return 0; }
äœãå€ãã£ãã®ãèŠãŠã¿ãŸãããã
Windows Server 2008 R2ã§ã®å
žåçãªåºåéå§ãã¹ãïŒã¹ãªãŒãïŒ1ïŒ
0ïŒçµé10413
1ïŒçµé8467
2ïŒçµé14365
3ïŒçµé14563
4ïŒçµé14389
å®æãã å¹³åæéïŒ12439
éå§ãã¹ãïŒsleep_forïŒãã€ã¯ãç§ïŒ500ïŒïŒ
0ïŒ11771ãçµé
1ïŒçµé14247
2ïŒçµé14323
3ïŒçµé14426
4ïŒçµé14757
å®æãã å¹³åæéïŒ13904
éå§ãã¹ãïŒWaitableTimer
0ïŒçµé12654
1ïŒçµé14700
2ïŒçµé14259
3ïŒçµé14505
4ïŒçµé14493
å®æãã å¹³åæéïŒ14122
ã芧ã®ãšãããå€åºå
ã§ã®ãµãŒãã¹ãªãã¬ãŒã·ã§ã³ã§ã¯ãäœãå€ãã£ãŠããŸããã ããã©ã«ãã§ã¯ããã®äžã§ã®ãããŒã©ã³ã¿ã€ã ã¯ã©ã³ã¿ã ã¯é垞巚倧ã§ãã XPãšWindows 7ãæèŒããä»®æ³ãã·ã³ã¯æ¢ããŸããããXPã§ããŸã£ããåæ§ã®ç¶æ³ã«ãªãå¯èœæ§ãé«ããšèšããŸãããWindows 7ã§ã¯ããã©ã«ãã®1ããªç§ã®ã¿ã€ã ã¹ã©ã€ã¹ã®ããã§ãã ã€ãŸã æ°ãããã¹ãã§ã¯ãWindows 8.1ã§ã®ä»¥åã®ãã¹ããšåãã€ã³ãžã±ãŒã¿ãŒãæäŸãããŸãã
ããã§ã¯ãWindows 8.1ã§ã®ããã°ã©ã ã®åºåãèŠãŠã¿ãŸããããéå§ãã¹ãïŒã¹ãªãŒãïŒ1ïŒ
0ïŒçµéãã1699
1ïŒçµé1444
2ïŒçµé1493
3ïŒçµé1482
4ïŒçµé1403
å®æãã å¹³åæéïŒ1504
éå§ãã¹ãïŒsleep_forïŒãã€ã¯ãç§ïŒ500ïŒïŒ
0ïŒçµé1259
1ïŒçµé1088
2ïŒçµé1497
3ïŒçµé1497
4ïŒçµé1528
å®æãã å¹³åæéïŒ1373
éå§ãã¹ãïŒWaitableTimer
0ïŒçµé643
1ïŒçµé481
2ïŒçµé424
3ïŒçµé330
4ïŒçµé468
å®æãã å¹³åæéïŒ469
äœãèŠããŸããïŒ æ°ããã¹ãªãããã§ããã®ã¯äºå®ã§ãïŒ ã€ãŸã Windows 8.1ã§ã¯ããã§ã«åé¡ã解決ããŠããŸãã äœãèµ·ãã£ãã®ã§ããïŒ ããã¯ããŠã£ã³ããŠ8.1ã§ã¯ã¿ã€ã ã¯ã©ã³ã¿ã ãããã500ãã€ã¯ãç§ã§ãã£ãããã«çºçããŸããã ã¯ããã¯ããã¹ã¬ããã¯500ãã€ã¯ãç§ã§å®è¡ãããŸãïŒç§ã®ã·ã¹ãã ã§ã¯ãããã©ã«ãã§è§£å床ã¯500.8ãã€ã¯ãç§ã«èšå®ãããæ£ç¢ºã«500ãã€ã¯ãç§ãèšå®ããããšãã§ããXP / Win7ãšã¯ç°ãªããããäœãèšå®ãããŠããŸããïŒæ°ããå®è¡ã§å®è¡ããŸãã
çµè«1 ïŒ
ç¡ç ïŒ0.5ïŒãå¿
èŠãšããããååã§ã¯ãªããæ£ããã¹ãªããã ããã«ã¯åžžã«åŸ
æ©å¯èœã¿ã€ããŒã䜿çšããŸãã
çµè«2 ïŒWin 8.1 / Win 10ã®ã¿ã§èšè¿°ããä»ã®OSã§å®è¡ããªãããšãä¿èšŒãããŠããå ŽåãWaitable Timerã®äœ¿çšãåæ¢ã§ããŸãã
ç¶æ³ãžã®äŸåãŸãã¯ã·ã¹ãã ã¿ã€ããŒã®ç²ŸåºŠãäžããæ¹æ³ãåé€ããŸã
ãã«ãã¡ãã£ã¢é¢æ°timeBeginPeriodã«ã€ããŠã¯æ¢ã«è¿°ã¹ãŸããã ããã¥ã¡ã³ãã«ã¯ããã®æ©èœã䜿çšããŠãã¿ã€ããŒã®ç²ŸåºŠãèšå®ã§ããããšãèšèŒãããŠããŸãã èŠãŠã¿ãŸãããã ããäžåºŠãããã°ã©ã ãå€æŽããŸãã
ããã°ã©ã v3 #include "stdafx.h" #include "PreciseTimer.h" #include "WaitableTimer.h" #pragma comment (lib, "Winmm.lib") void test(const std::string& description, const std::function<void(void)>& f) { PreciseTimer timer; std::cout << "Starting test: " << description << std::endl; std::int64_t total = 0; for (unsigned i = 0; i < 5; ++i) { auto t1 = timer.Microsec(); f(); auto t2 = timer.Microsec(); auto elapsedMicrosec = t2 - t1; total += elapsedMicrosec; std::cout << i << ": Elapsed " << elapsedMicrosec << std::endl; } std::cout << "Finished. average time:" << (total / 5) << std::endl; } void runTestPack() { test("Sleep(1)", [] { ::Sleep(1); }); test("sleep_for(microseconds(500))", [] { std::this_thread::sleep_for(std::chrono::microseconds(500)); }); WaitableTimer timer; test("WaitableTimer", [&timer] { timer.SetAndWait(5000); }); } int main() { runTestPack(); std::cout << "Timer resolution is set to 1 ms" << std::endl; // timeGetDevCaps , , // , timeBeginPeriod(1); ::Sleep(1); // ::Sleep(1); // runTestPack(); timeEndPeriod(1); return 0; }
äŒçµ±çã«ãç§ãã¡ã®ããã°ã©ã ã®å
žåçãªçºèŠã
Windows 8.1ã®å Žåéå§ãã¹ãïŒã¹ãªãŒãïŒ1ïŒ
0ïŒ2006幎ã®çµé
1ïŒçµé1398
2ïŒçµé1390
3ïŒçµé1424
4ïŒçµé1424
å®æãã å¹³åæéïŒ1528
éå§ãã¹ãïŒsleep_forïŒãã€ã¯ãç§ïŒ500ïŒïŒ
0ïŒçµé1348
1ïŒçµé1418
2ïŒçµé1459
3ïŒçµé1475
4ïŒçµé1503
å®æãã å¹³åæéïŒ1440
éå§ãã¹ãïŒWaitableTimer
0ïŒçµé200
1ïŒçµé469
2ïŒçµé442
3ïŒçµé456
4ïŒçµé462
å®æãã å¹³åæéïŒ405
ã¿ã€ããŒã®è§£å床ã¯1ããªç§ã«èšå®ãããŠããŸã
éå§ãã¹ãïŒã¹ãªãŒãïŒ1ïŒ
0ïŒçµé1705
1ïŒçµé1412
2ïŒçµé1411
3ïŒçµé1441
4ïŒçµé1408
å®æãã å¹³åæéïŒ1475
éå§ãã¹ãïŒsleep_forïŒãã€ã¯ãç§ïŒ500ïŒïŒ
0ïŒ1916幎çµé
1ïŒçµé1451
2ïŒçµé1415
3ïŒçµé1429
4ïŒçµé1223
å®æãã å¹³åæéïŒ1486
éå§ãã¹ãïŒWaitableTimer
0ïŒçµé602
1ïŒçµé445
2ïŒçµé994
3ïŒçµé347
4ïŒçµé345
å®æãã å¹³åæéïŒ546
ãããŠãWindows Server 2008 R2éå§ãã¹ãïŒã¹ãªãŒãïŒ1ïŒ
0ïŒçµé10306
1ïŒçµé13799
2ïŒçµé13867
3ïŒçµé13877
4ïŒçµé13869
å®æãã å¹³åæéïŒ13143
éå§ãã¹ãïŒsleep_forïŒãã€ã¯ãç§ïŒ500ïŒïŒ
0ïŒçµé10847
1ïŒçµé13986
2ïŒçµé14000
3ïŒçµé13898
4ïŒçµé13834
å®æãã å¹³åæéïŒ13313
éå§ãã¹ãïŒWaitableTimer
0ïŒçµé11454
1ïŒçµé13821
2ïŒçµé14014
3ïŒçµé13852
4ïŒçµé13837
å®æãã å¹³åæéïŒ13395
ã¿ã€ããŒã®è§£å床ã¯1ããªç§ã«èšå®ãããŠããŸã
éå§ãã¹ãïŒã¹ãªãŒãïŒ1ïŒ
0ïŒ940ãçµé
1ïŒçµé218
2ïŒçµé276
3ïŒçµé352
4ïŒçµé384
å®æãã å¹³åæéïŒ434
éå§ãã¹ãïŒsleep_forïŒãã€ã¯ãç§ïŒ500ïŒïŒ
0ïŒçµé797
1ïŒçµé386
2ïŒçµé371
3ïŒçµé389
4ïŒçµé371
å®æãã å¹³åæéïŒ462
éå§ãã¹ãïŒWaitableTimer
0ïŒçµé323
1ïŒçµé338
2ïŒçµé309
3ïŒçµé359
4ïŒçµé391
å®æãã å¹³åæéïŒ344
çµæããèŠããèå³æ·±ãäºå®ãåæããŸãããã
- Windows 8.1ã§ã¯ãäœãå€æŽãããŠããŸããã timeBeginPeriodã¯ååã«è³¢ããã€ãŸã Nåã®ã¢ããªã±ãŒã·ã§ã³ãç°ãªãå€ã§ã·ã¹ãã ã¿ã€ããŒã®è§£å床ãèŠæ±ããå Žåããã®è§£å床ã¯äœäžããŸããã Windows 7ã§ã¯ãã¿ã€ããŒã®è§£å床ãæ¢ã«1ããªç§ã§ãããããå€æŽãèªèãããŸããã
- ãµãŒããŒOSã§ã¯ã timeBeginPeriodïŒ1ïŒã¯äºæããªãæ¹æ³ã§åäœããŸãããã·ã¹ãã ã¿ã€ããŒã®è§£å床ãå¯èœãªéãé«ãå€ã«èšå®ããŸããã ã€ãŸã ãã®ãããªOSã§ã¯ããã©ãŒã ã®åé¿çãæããã«çž«ãä»ããããŠããŸãïŒ
void timeBeginPerion(UINT uPeriod) { if (uPeriod == 1) { setMaxTimerResolution(); return; } ... }
ããã¯ãWindows Server 2003 R2ã§ã¯ãããŸã§çºçããŠããªãã£ãããšã«æ³šæããŠãã ããã ããã¯2008ãµãŒããŒã®é©æ°ã§ãã
- ãµãŒããŒOSã§ã¯ã SleepïŒ1ïŒãäºæããªãæ¹æ³ã§åäœããŸããã ã€ãŸã ã¹ãªãŒãïŒ1ïŒã¯ ã ãµãŒããŒOSã§ã¯2008ãµãŒããŒãã ã 1ããªç§ã®äžæåæ¢ ãã§ã¯ãªãã ã§ããéãæå°ã®äžæåæ¢ ããšããŠè§£éãããŸã ã ãã®å Žåããã®èšè¿°ãæ£ãããªãå ŽåããããŸãã
çµè«ãç¶ããŸãããã
çµè«3 ïŒWin Server 2008/2012/2016ã§ã®ã¿èšè¿°ããä»ã®OSã§å®è¡ããªãããšãä¿èšŒãããŠããå Žåãæ°ã«ããå¿
èŠã¯ãŸã£ãããããŸãã
ãtimeBeginPeriodïŒ1ïŒãšããã«ç¶ã
SleepïŒ1ïŒãå¿
èŠãªãã¹ãŠãè¡ããŸãã
çµè«4 ïŒç§ãã¡ã®ç®çã®ããã®
timeBeginPeriodã¯ããµãŒããŒè»žã«å¯ŸããŠã®ã¿æå¹ã§ãã ãã ããWaitableã¿ã€ããŒãšå
±æãããšãWin Server 2008/2012/2016ããã³Windows 8.1 / Windows 10ã§ã®ã¿ã¹ã¯ãã«ããŒãããŸãã
äžåºŠã«ãã¹ãŠãå¿
èŠãªå Žåã¯ã©ããªããŸããïŒ
Windows XP / Windows Vista / Windows 7 / Windows Server 2003ã§ã¹ãªãŒãïŒ0.5ïŒãå¿
èŠãªå Žåã®å¯ŸåŠæ¹æ³ãèããŠã¿ãŸãããã
ãã€ãã£ãAPIã®ã¿ãå©ãã«ãªããŸã-ntdll.dllãä»ããŠãŠãŒã¶ãŒç©ºéããã¢ã¯ã»ã¹ã§ãããææžåãããŠããªãAPIã§ãã èå³æ·±ãNtQueryTimerResolution / NtSetTimerResolutioné¢æ°ããããŸãã
AdjustSystemTimerResolutionTo500mcsé¢æ°ãäœæããŸãã ULONG AdjustSystemTimerResolutionTo500mcs() { static const ULONG resolution = 5000;
ã³ãŒããã³ã³ãã€ã«ããã«ã¯ãå¿
èŠãªé¢æ°ã®å®£èšãè¿œå ããŸãã #include <winnt.h> #ifndef NT_ERROR #define NT_ERROR(Status) ((((ULONG)(Status)) >> 30) == 3) #endif extern "C" { NTSYSAPI NTSTATUS NTAPI NtSetTimerResolution( _In_ ULONG DesiredResolution, _In_ BOOLEAN SetResolution, _Out_ PULONG CurrentResolution); NTSYSAPI NTSTATUS NTAPI NtQueryTimerResolution( _Out_ PULONG MaximumResolution, _Out_ PULONG MinimumResolution, _Out_ PULONG CurrentResolution); } #pragma comment (lib, "ntdll.lib")
Windows 8.1ã§ã®å
žåçãªåºåéå§ãã¹ãïŒã¹ãªãŒãïŒ1ïŒ
0ïŒçµé13916
1ïŒçµé14995
2ïŒçµé3041
3ïŒçµé2247
4ïŒçµé15141
å®æãã å¹³åæéïŒ9868
éå§ãã¹ãïŒsleep_forïŒãã€ã¯ãç§ïŒ500ïŒïŒ
0ïŒçµé12359
1ïŒçµé14607
2ïŒçµé15019
3ïŒçµé14957
4ïŒçµé14888
å®æãã å¹³åæéïŒ14366
éå§ãã¹ãïŒWaitableTimer
0ïŒçµéãã12783
1ïŒçµé14848
2ïŒçµé14647
3ïŒçµé14550
4ïŒçµé14888
å®æãã å¹³åæéïŒ14343
ã¿ã€ããŒã®è§£å床ã¯1ããªç§ã«èšå®ãããŠããŸã
éå§ãã¹ãïŒã¹ãªãŒãïŒ1ïŒ
0ïŒçµé1175
1ïŒçµé1501
2ïŒçµé1473
3ïŒçµé1147
4ïŒçµé1462
å®æãã å¹³åæéïŒ1351
éå§ãã¹ãïŒsleep_forïŒãã€ã¯ãç§ïŒ500ïŒïŒ
0ïŒçµé1030
1ïŒçµé1376
2ïŒçµé1452
3ïŒçµé1335
4ïŒçµé1467
å®æãã å¹³åæéïŒ1332
éå§ãã¹ãïŒWaitableTimer
0ïŒçµé105
1ïŒçµé394
2ïŒçµé429
3ïŒçµé927
4ïŒçµé505
å®æãã å¹³åæéïŒ472
Windows Server 2008 R2ã§ã®å
žåçãªåºåéå§ãã¹ãïŒã¹ãªãŒãïŒ1ïŒ
0ïŒ7364ãçµé
1ïŒçµé14056
2ïŒçµé14188
3ïŒçµé13910
4ïŒçµé14178
å®æãã å¹³åæéïŒ12739
éå§ãã¹ãïŒsleep_forïŒãã€ã¯ãç§ïŒ500ïŒïŒ
0ïŒçµé11404
1ïŒçµé13745
2ïŒçµé13975
3ïŒçµé14006
4ïŒçµé14037
å®æãã å¹³åæéïŒ13433
éå§ãã¹ãïŒWaitableTimer
0ïŒçµé11697
1ïŒçµé14174
2ïŒçµé13808
3ïŒ14010çµé
4ïŒçµéãã14054
å®æãã å¹³åæéïŒ13548
ã¿ã€ããŒã®è§£å床ã¯1ããªç§ã«èšå®ãããŠããŸã
éå§ãã¹ãïŒã¹ãªãŒãïŒ1ïŒ
0ïŒçµé10690
1ïŒçµé14308
2ïŒçµé768
3ïŒçµé823
4ïŒçµé803
å®æãã å¹³åæéïŒ5478
éå§ãã¹ãïŒsleep_forïŒãã€ã¯ãç§ïŒ500ïŒïŒ
0ïŒçµéãã983
1ïŒçµé955
2ïŒçµé946
3ïŒçµé937
4ïŒçµé946
å®æãã å¹³åæéïŒ953
éå§ãã¹ãïŒWaitableTimer
0ïŒçµé259
1ïŒçµé456
2ïŒçµé453
3ïŒçµé456
4ïŒçµé460
å®æãã å¹³åæéïŒ416
芳å¯ãšçµè«ãåºãããšã¯æ®ã£ãŠããŸãã
芳å¯ïŒ
- Win8ã§ã¯ãããã°ã©ã ã®æåã®èµ·ååŸãã·ã¹ãã ã¿ã€ããŒã®è§£å床ã倧ããªå€ã«ãªã»ãããããŸããã ã€ãŸã çµè«2ã¯ãç§ãã¡ãééã£ãŠããŸããã
- æåã€ã³ã¹ããŒã«åŸãå¹³åã¹ãªããã¯çŽ500ãã€ã¯ãç§ã§ãããWaitableTimerã±ãŒã¹ã®å®éã®ã¹ãªããã®åºãããå¢å ããŸããã
- ãµãŒããŒOSã§ã¯ã timeBeginPeriodã®å Žåãšæ¯èŒããŠã SleepïŒ1ïŒã¯éåžžã«äºæããåäœãåæ¢ããŸããïŒ this_thread :: sleep_forãªã© ïŒã ã€ãŸã ã¹ãªãŒãïŒ1ïŒã¯æ£åžžã«æ©èœãå§ããŸãããã€ãŸããã 1ããªç§éäžæåæ¢ããŸããã
æçµçãªçµè«
- çµè«1ã«å€æŽã¯ãããŸããã§ããã ç¡ç ïŒ0.5ïŒãå¿
èŠã§ãããååã§ã¯ãªããããæ£ããã¹ãªãããå¿
èŠã§ãã ããã«ã¯åžžã«åŸ
æ©å¯èœã¿ã€ããŒã䜿çšããŸãã
- çµè«2 ïŒWindowsã®ã·ã¹ãã ã¿ã€ããŒã®è§£å床ã¯ãWindowsã®çš®é¡ãWindowsã®ããŒãžã§ã³ãçŸåšå®è¡äžã®ããã»ã¹ãåã«å®è¡ã§ããããã»ã¹ã«ãã£ãŠç°ãªããŸãã ã€ãŸã äœã䞻匵ãä¿èšŒãã§ããŸããïŒ ä¿èšŒãå¿
èŠãªå Žåã¯ãå¿
èŠãªç²ŸåºŠãåžžã«èŠæ±/èšå®ããå¿
èŠããããŸãã 1ããªç§æªæºã®å€ã®å Žåããã€ãã£ãAPIã䜿çšããå¿
èŠããããŸãã å€ã倧ããå Žåã¯ã timeBeginPeriodã䜿çšããããšããå§ãããŸãã
- çµè«3 ïŒå¯èœã§ããã°ãäœæ¥äžã®Win 10ã ãã§ãªããäž»èŠãªé¡§å®¢ããæ瀺ãããã³ãŒãã§ããã¹ãããããšããå§ãããŸãã ãµãŒããŒOSã¯ãã¹ã¯ããããšã¯å€§ããç°ãªãå¯èœæ§ãããããšã«æ³šæããŠãã ãã