{"id":797,"date":"2025-04-21T17:06:16","date_gmt":"2025-04-21T09:06:16","guid":{"rendered":"https:\/\/www.hyy.net\/?p=797"},"modified":"2025-04-21T17:06:16","modified_gmt":"2025-04-21T09:06:16","slug":"csharp-clock-six","status":"publish","type":"post","link":"https:\/\/diji.net\/?p=797","title":{"rendered":"C# \u516d\u79cd\u65b9\u5f0f\u5b9e\u73b0\u7cbe\u786e\u8ba1\u65f6"},"content":{"rendered":"<p>C# \u516d\u79cd\u65b9\u5f0f\u5b9e\u73b0\u7cbe\u786e\u8ba1\u65f6<\/p>\n<p>\u6839\u636e\u7efc\u5408\u7f51\u4e0a\u7684\u4e00\u4e9b\u6587\u7ae0\uff0c\u7cbe\u786e\u8ba1\u65f6\u4e3b\u8981\u6709\u4ee5\u4e0b\u51e0\u79cd\u65b9\u5f0f<\/p>\n<h3>1 \u8c03\u7528WIN API\u4e2d\u7684GetTickCount<\/h3>\n<pre><code>[DllImport(&quot;kernel32&quot;)]static extern uint GetTickCount();<\/code><\/pre>\n<p>\u4ece\u64cd\u4f5c\u7cfb\u7edf\u542f\u52a8\u5230\u73b0\u5728\u6240\u7ecf\u8fc7\u7684\u6beb\u79d2\u6570\uff0c\u7cbe\u5ea6\u4e3a1\u6beb\u79d2\uff0c\u7ecf\u7b80\u5355\u6d4b\u8bd5\u53d1\u73b0\u5176\u5b9e\u8bef\u5dee\u5728\u5927\u7ea6\u572815ms\u5de6\u53f3<\/p>\n<p>\u7f3a\u70b9\uff1a\u8fd4\u56de\u503c\u662fuint,\u6700\u5927\u503c\u662f2\u768432\u6b21\u65b9\uff0c\u56e0\u6b64\u5982\u679c\u670d\u52a1\u5668\u8fde\u7eed\u5f00\u673a\u5927\u7ea649\u5929\u4ee5\u540e\uff0c\u8be5\u65b9\u6cd5\u53d6\u5f97\u7684\u8fd4\u56de\u503c\u4f1a\u5f52\u96f6<\/p>\n<p>\u7528\u6cd5\uff1a<\/p>\n<pre><code>uint s1 = GetTickCount();\nThread.Sleep(2719);\nConsole.WriteLine(GetTickCount() - s1);  \/\/\u5355\u4f4d\u6beb\u79d2<\/code><\/pre>\n<h3>2 \u8c03\u7528WIN API\u4e2d\u7684timeGetTime  \u63a8\u8350<\/h3>\n<pre><code>[DllImport(&quot;winmm&quot;)]\nstatic extern uint timeGetTime();<\/code><\/pre>\n<p>\u5e38\u7528\u4e8e\u591a\u5a92\u4f53\u5b9a\u65f6\u5668\u4e2d\uff0c\u4e0eGetTickCount\u7c7b\u4f3c\uff0c\u4e5f\u662f\u8fd4\u56de\u64cd\u4f5c\u7cfb\u7edf\u542f\u52a8\u5230\u73b0\u5728\u6240\u7ecf\u8fc7\u7684\u6beb\u79d2\u6570\uff0c\u7cbe\u5ea6\u4e3a1\u6beb\u79d2\u3002<\/p>\n<p>\u4e00\u822c\u9ed8\u8ba4\u7684\u7cbe\u5ea6\u4e0d\u6b621\u6beb\u79d2\uff08\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u6709\u6240\u4e0d\u540c\uff09\uff0c\u9700\u8981\u8c03\u7528timeBeginPeriod\u4e0etimeEndPeriod\u6765\u8bbe\u7f6e\u7cbe\u5ea6<\/p>\n<pre><code>[DllImport(&quot;winmm&quot;)]\nstatic extern void timeBeginPeriod(int t);\n[DllImport(&quot;winmm&quot;)]\nstatic extern void timeEndPeriod(int t);<\/code><\/pre>\n<p>\u7f3a\u70b9\uff1a\u4e0eGetTickCount\u4e00\u6837\uff0c\u53d7\u8fd4\u56de\u503c\u7684\u6700\u5927\u4f4d\u6570\u9650\u5236\u3002<\/p>\n<p>\u7528\u6cd5\uff1a<\/p>\n<pre><code>timeBeginPeriod(1);uint start = timeGetTime();\nThread.Sleep(2719);\nConsole.WriteLine(timeGetTime() - start);  \/\/\u5355\u4f4d\u6beb\u79d2timeEndPeriod(1);<\/code><\/pre>\n<h3>3 \u8c03\u7528.net\u81ea\u5e26\u7684\u65b9\u6cd5System.Environment.TickCount<\/h3>\n<p>\u83b7\u53d6\u7cfb\u7edf\u542f\u52a8\u540e\u7ecf\u8fc7\u7684\u6beb\u79d2\u6570\u3002\u7ecf\u53cd\u7f16\u8bd1\u731c\u6d4b\u5b83\u53ef\u80fd\u4e5f\u662f\u8c03\u7528\u7684GetTickCount\uff0c\u4f46\u662f\u5b83\u7684\u8fd4\u56de\u503c\u662fint\uff0c\u800cGetTickCount\u4e0etimeGetTime\u65b9\u6cd5\u7684\u539f\u578b\u4e2d\u8fd4\u56de\u503c\u662fDWORD\uff0c\u5bf9\u5e94C#\u4e2d\u7684uint\uff0c\u96be\u9053.NET\u5bf9System.Environment.TickCount\u53e6\u5916\u8fd8\u505a\u4e86\u4ec0\u4e48\u5904\u7406\u4e48\uff1f<br \/>\n\u7f3a\u70b9\uff1a\u4e0eGetTickCount\u4e00\u6837\uff0c\u53d7\u8fd4\u56de\u503c\u7684\u6700\u5927\u4f4d\u6570\u9650\u5236\u3002<\/p>\n<p>\u7528\u6cd5\uff1a<\/p>\n<pre><code>int aa = System.Environment.TickCount;\nThread.Sleep(2719);\nConsole.WriteLine(System.Environment.TickCount - aa); \/\/\u5355\u4f4d\u6beb\u79d2<\/code><\/pre>\n<p>\u6ce8\uff1a\u7ecf\u8fc7\u6d4b\u8bd5\uff0c\u53d1\u73b0GetTickCount\u3001System.Environment.TickCount\u4e5f\u53ef\u4ee5\u7528timeBeginPeriod\u4e0etimeEndPeriod\u6765\u8bbe\u7f6e\u7cbe\u5ea6\uff0c\u6700\u9ad8\u53ef\u5c06\u7cbe\u5ea6\u63d0\u9ad8\u52301\u6beb\u79d2\u3002\u4e0d\u77e5\u662f\u4ec0\u4e48\u539f\u56e0\uff1f<\/p>\n<h3>4 \u8c03\u7528WIN API\u4e2d\u7684QueryPerformanceCounter<\/h3>\n<pre><code>[DllImport(&quot;kernel32.dll &quot;)]\nstatic extern bool QueryPerformanceCounter(ref   long lpPerformanceCount);<\/code><\/pre>\n<p>\u7528\u4e8e\u5f97\u5230\u9ad8\u7cbe\u5ea6\u8ba1\u65f6\u5668\uff08\u5982\u679c\u5b58\u5728\u8fd9\u6837\u7684\u8ba1\u65f6\u5668\uff09\u7684\u503c\u3002\u5fae\u8f6f\u5bf9\u8fd9\u4e2aAPI\u89e3\u91ca\u5c31\u662f\u6bcf\u79d2\u949f\u67d0\u4e2a\u8ba1\u6570\u5668\u589e\u957f\u7684\u6570\u503c\u3002<br \/>\n\u5982\u679c\u5b89\u88c5\u7684\u786c\u4ef6\u4e0d\u652f\u6301\u9ad8\u7cbe\u5ea6\u8ba1\u65f6\u5668,\u51fd\u6570\u5c06\u8fd4\u56defalse\u9700\u8981\u914d\u5408\u53e6\u4e00\u4e2aAPI\u51fd\u6570QueryPerformanceFrequency\u3002<\/p>\n<pre><code>[DllImport(&quot;kernel32&quot;)]\nstatic extern bool QueryPerformanceFrequency(ref long PerformanceFrequency);\n QueryPerformanceFrequency\u8fd4\u56de\u786c\u4ef6\u652f\u6301\u7684\u9ad8\u7cbe\u5ea6\u8ba1\u6570\u5668\u7684\u9891\u7387\uff0c\u5982\u679c\u5b89\u88c5\u7684\u786c\u4ef6\u4e0d\u652f\u6301\u9ad8\u7cbe\u5ea6\u8ba1\u65f6\u5668,\u51fd\u6570\u5c06\u8fd4\u56defalse\u3002<\/code><\/pre>\n<p>\u7528\u6cd5\uff1a<\/p>\n<pre><code>long a = 0;\nQueryPerformanceFrequency(ref a);long b = 0, c = 0;\nQueryPerformanceCounter(ref b);\nThread.Sleep(2719);\nQueryPerformanceCounter(ref c);\nConsole.WriteLine((c - b) \/ (decimal)a);  \/\/\u5355\u4f4d\u79d2<\/code><\/pre>\n<p>\u7cbe\u5ea6\u4e3a\u767e\u4e07\u5206\u4e4b\u4e00\u79d2\u3002\u800c\u4e14\u7531\u4e8e\u662flong\u578b\uff0c\u6240\u4ee5\u4e0d\u5b58\u5728\u4e0a\u9762\u51e0\u4e2aAPI\u4f4d\u6570\u4e0d\u591f\u7684\u95ee\u9898\u3002<\/p>\n<p>\u7f3a\u70b9\uff1a\u5728\u4e00\u7bc7\u6587\u7ae0\u770b\u5230\uff0c\u8be5API\u5728\u8282\u80fd\u6a21\u5f0f\u7684\u65f6\u5019\u7ed3\u679c\u504f\u6162\uff0c\u8d85\u9891\u6a21\u5f0f\u7684\u65f6\u5019\u53c8\u504f\u5feb\uff0c\u800c\u4e14\u7528\u7535\u6c60\u548c\u63a5\u7535\u6e90\u7684\u65f6\u5019\u6548\u679c\u8fd8\u4e0d\u4e00\u6837\uff08\u7b14\u8bb0\u672c\uff09<br \/>\n\u539f\u6587\u5730\u5740\uff1a<a href=\"http:\/\/delphi.xcjc.net\/viewthread.php?tid=1570\">http:\/\/delphi.xcjc.net\/viewthread.php?tid=1570<\/a><br \/>\n\u672a\u7ecf\u8fc7\u8d85\u9891\u7b49\u6d4b\u8bd5\uff0c\u5982\u679c\u662f\u771f\u7684\uff0c\u90a3\u8be5API\u51fa\u6765\u7684\u7ed3\u679c\u5c31\u53ef\u80fd\u4e0d\u51c6\u3002<\/p>\n<h3>5 \u4f7f\u7528.net\u7684System.Diagnostics.Stopwatch\u7c7b    \u63a8\u8350<\/h3>\n<p>Stopwatch \u5728\u57fa\u7840\u8ba1\u65f6\u5668\u673a\u5236\u4e2d\u5bf9\u8ba1\u65f6\u5668\u7684\u523b\u5ea6\u8fdb\u884c\u8ba1\u6570\uff0c\u4ece\u800c\u6d4b\u91cf\u8fd0\u884c\u65f6\u95f4\u3002\u5982\u679c\u5b89\u88c5\u7684\u786c\u4ef6\u548c\u64cd\u4f5c\u7cfb\u7edf\u652f\u6301\u9ad8\u5206\u8fa8\u7387\u6027\u80fd\u7684\u8ba1\u6570\u5668\uff0c\u5219 Stopwatch \u7c7b\u5c06\u4f7f\u7528\u8be5\u8ba1\u6570\u5668\u6765\u6d4b\u91cf\u8fd0\u884c\u65f6\u95f4\uff1b\u5426\u5219\uff0cStopwatch \u7c7b\u5c06\u4f7f\u7528\u7cfb\u7edf\u8ba1\u6570\u5668\u6765\u6d4b\u91cf\u8fd0\u884c\u65f6\u95f4\u3002\u4f7f\u7528 Frequency \u548c IsHighResolution \u4e24\u4e2a\u9759\u6001\u5b57\u6bb5\u53ef\u4ee5\u786e\u5b9a\u5b9e\u73b0 Stopwatch \u8ba1\u65f6\u7684\u7cbe\u5ea6\u548c\u5206\u8fa8\u7387\u3002<\/p>\n<p>\u5b9e\u9645\u4e0a\u5b83\u91cc\u9762\u5c31\u662f\u5c06QueryPerformanceCounter\u3001QueryPerformanceFrequency\u4e24\u4e2aWIN API\u5c01\u88c5\u4e86\u4e00\u4e0b\uff0c\u5982\u679c\u786c\u4ef6\u652f\u6301\u9ad8\u7cbe\u5ea6\uff0c\u5c31\u8c03\u7528QueryPerformanceCounter\uff0c\u5982\u679c\u4e0d\u652f\u6301\u5c31\u7528DateTime.Ticks\u6765\u8ba1\u7b97\u3002<\/p>\n<p>\u7528\u6cd5\uff1a<\/p>\n<pre><code>Stopwatch sw = new Stopwatch();\nsw.Start();\nThread.Sleep(2719);\nsw.Stop();\nConsole.WriteLine(sw.ElapsedTicks \/ (decimal)Stopwatch.Frequency);<\/code><\/pre>\n<h3>6 \u4f7f\u7528CPU\u65f6\u95f4\u6233\u8fdb\u884c\u66f4\u9ad8\u7cbe\u5ea6\u8ba1\u65f6<\/h3>\n<p>\u539f\u6587\u5730\u5740\uff1a<a href=\"http:\/\/www.chinaunix.net\/jh\/23\/110190.html\">http:\/\/www.chinaunix.net\/jh\/23\/110190.html<\/a><\/p>\n<p>\u8be5\u65b9\u6cd5\u7684\u539f\u7406\u6211\u4e0d\u662f\u5f88\u660e\u767d\uff0c\u786c\u4ef6\u77e5\u8bc6\u592a\u532e\u4e4f\u4e86\u3002\u7cbe\u5ea6\u662fns<\/p>\n<p>\u5728C#\u4e2d\u8981\u7528\u8be5\u65b9\u6cd5\u5fc5\u987b\u5148\u5efa\u7acb\u4e00\u4e2a\u6258\u7ba1C++\u9879\u76ee\uff08\u56e0\u4e3a\u8981\u5185\u5d4c\u6c47\u7f16\uff09\uff0c\u7f16\u8bd1\u6210DLL\u4f9bc#\u8c03\u7528\uff0c\u6709\u70b9\u9ebb\u70e6\u3002<\/p>\n<p>C++\u4ee3\u7801\uff1a<\/p>\n<pre><code>\/\/ MLTimerDot.h\n #pragma once \nusing namespace System; \nnamespace MLTimerDot { \n        \/\/\u5f97\u5230\u8ba1\u7b97\u673a\u542f\u52a8\u5230\u73b0\u5728\u7684\u65f6\u949f\u5468\u671f\n        unsigned __int64 GetCycleCount(void)\n        {\n                _asm  _emit 0x0F\n                _asm  _emit 0x31\n        } \n\n        \/\/\u58f0\u660e .NET \u7c7b\n        public __gc class MLTimer\n        {        public:\n                MLTimer(void)\n                {\n\n                } \n                \/\/\u8ba1\u7b97\u65f6\u949f\u5468\u671f\n                UInt64 GetCount(void)\n                {                        return GetCycleCount();\n                }\n\n        };\n}<\/code><\/pre>\n<p>C#\u8c03\u7528\uff1a<\/p>\n<pre><code>long a = 0;\nQueryPerformanceFrequency(ref a);\n\nMLTimerDot.MLTimer timer = new MLTimerDot.MLTimer();ulong ss= timer.GetCount();\nThread.Sleep(2719);\nConsole.WriteLine((timer.GetCount() - ss) \/ (decimal)a);<\/code><\/pre>\n<p>\u7f3a\u70b9\uff1a\u548cQueryPerformanceCounter\u4e00\u6837\uff0c\u7ed3\u679c\u4e0d\u592a\u7a33\u5b9a\u3002<\/p>\n<p>\u6211\u7684\u7ed3\u8bba\uff1a\u5e38\u89c4\u5e94\u7528\u4e0btimeGetTime\u5b8c\u5168\u591f\u7528\u4e86\uff0c\u5c06\u7cbe\u5ea6\u8c03\u52301\u6beb\u79d2\uff0c\u5927\u90e8\u5206\u5883\u51b5\u90fd\u591f\u7528\u3002System.Diagnostics.Stopwatch\u7531\u4e8e\u8c03\u7528\u65b9\u4fbf\uff0c\u4e5f\u63a8\u8350\u4f7f\u7528<\/p>\n<p><a href=\"https:\/\/mp.weixin.qq.com\/s?__biz=MzI2NDE1MDE1MQ==&amp;mid=2650849163&amp;idx=1&amp;sn=07ef704fdcdef7a44d2239ec72503fda&amp;chksm=f1451263c6329b75cc6c8e21db0a720bf6ba0e32b3dadd219e3a65f7073e92e463059ca6ee2c&amp;cur_album_id=1924294891300290563&amp;scene=190#rd\">https:\/\/mp.weixin.qq.com\/s?__biz=MzI2NDE1MDE1MQ==&mid=2650849163&idx=1&sn=07ef704fdcdef7a44d2239ec72503fda&chksm=f1451263c6329b75cc6c8e21db0a720bf6ba0e32b3dadd219e3a65f7073e92e463059ca6ee2c&cur_album_id=1924294891300290563&scene=190#rd<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>C# \u516d\u79cd\u65b9\u5f0f\u5b9e\u73b0\u7cbe\u786e\u8ba1\u65f6 \u6839\u636e\u7efc\u5408\u7f51\u4e0a\u7684\u4e00\u4e9b\u6587\u7ae0\uff0c\u7cbe\u786e\u8ba1\u65f6\u4e3b\u8981\u6709\u4ee5\u4e0b\u51e0\u79cd\u65b9\u5f0f 1 \u8c03\u7528WIN API\u4e2d\u7684GetTickCount [DllImport(&quot;kernel32&quot;)]static extern uint GetTickCount(); \u4ece\u64cd\u4f5c\u7cfb\u7edf\u542f\u52a8\u5230\u73b0\u5728\u6240\u7ecf\u8fc7\u7684\u6beb\u79d2\u6570\uff0c\u7cbe\u5ea6\u4e3a1\u6beb\u79d2\uff0c\u7ecf\u7b80\u5355\u6d4b\u8bd5\u53d1\u73b0\u5176\u5b9e\u8bef\u5dee\u5728\u5927\u7ea6\u572815ms\u5de6\u53f3 \u7f3a\u70b9\uff1a\u8fd4\u56de\u503c\u662fuint,\u6700\u5927\u503c\u662f2\u768432\u6b21\u65b9\uff0c\u56e0\u6b64\u5982\u679c\u670d\u52a1\u5668\u8fde\u7eed\u5f00\u673a\u5927\u7ea649\u5929\u4ee5\u540e\uff0c\u8be5\u65b9\u6cd5\u53d6\u5f97\u7684\u8fd4\u56de\u503c\u4f1a\u5f52\u96f6 \u7528\u6cd5\uff1a uint s1 = GetTickCount(); Thread.Sleep(2719); Console.WriteLine(GetTickCount() &#8211; s1); \/\/\u5355\u4f4d\u6beb\u79d2 2 \u8c03\u7528WIN API\u4e2d\u7684timeGetTime \u63a8\u8350 [DllImport(&quot;winmm&quot;)] static extern uint timeGetTime(); \u5e38\u7528\u4e8e\u591a\u5a92\u4f53\u5b9a\u65f6\u5668\u4e2d\uff0c\u4e0eGetTickCount\u7c7b\u4f3c\uff0c\u4e5f\u662f\u8fd4\u56de\u64cd\u4f5c\u7cfb\u7edf\u542f\u52a8\u5230\u73b0\u5728\u6240\u7ecf\u8fc7\u7684\u6beb\u79d2\u6570\uff0c\u7cbe\u5ea6\u4e3a1\u6beb\u79d2\u3002 \u4e00\u822c\u9ed8\u8ba4\u7684\u7cbe\u5ea6\u4e0d\u6b621\u6beb\u79d2\uff08\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u6709\u6240\u4e0d\u540c\uff09\uff0c\u9700\u8981\u8c03\u7528timeBeginPeriod\u4e0etimeEndPeriod\u6765\u8bbe\u7f6e\u7cbe\u5ea6 [DllImport(&quot;winmm&quot;)] static extern void timeBeginPeriod(int t); [DllImport(&quot;winmm&quot;)] static extern void timeEndPeriod(int t); \u7f3a\u70b9\uff1a\u4e0eGetTickCount\u4e00\u6837\uff0c\u53d7\u8fd4\u56de\u503c\u7684\u6700\u5927\u4f4d\u6570\u9650\u5236\u3002 \u7528\u6cd5\uff1a timeBeginPeriod(1);uint start = timeGetTime(); Thread.Sleep(2719); Console.WriteLine(timeGetTime() &#8211; start); [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-797","post","type-post","status-publish","format-standard","hentry","category-csharp"],"_links":{"self":[{"href":"https:\/\/diji.net\/index.php?rest_route=\/wp\/v2\/posts\/797","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/diji.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/diji.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/diji.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/diji.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=797"}],"version-history":[{"count":0,"href":"https:\/\/diji.net\/index.php?rest_route=\/wp\/v2\/posts\/797\/revisions"}],"wp:attachment":[{"href":"https:\/\/diji.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/diji.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/diji.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}