久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C#中精確計時的一點收獲 (轉(zhuǎn))

 franklinfj 2013-05-02

C#中精確計時的一點收獲

以下所有代碼運行環(huán)境:Windows 2003, Intel(R) Core(TM) 2 Duo CPU E8400 @  3.00GHz 2.99GHz,2.96GB內(nèi)存

根據(jù)綜合網(wǎng)上的一些文章,精確計時主要有以下幾種方式

1 調(diào)用WIN API中的GetTickCount

[DllImport("kernel32")]
static extern uint GetTickCount();

從操作系統(tǒng)啟動到現(xiàn)在所經(jīng)過的毫秒數(shù),,精度為1毫秒,,經(jīng)簡單測試發(fā)現(xiàn)其實誤差在大約在15ms左右

缺點:返回值是uint,最大值是2的32次方,,因此如果服務(wù)器連續(xù)開機大約49天以后,該方法取得的返回值會歸零

用法:

1
2
3
uint s1 = GetTickCount();
Thread.Sleep(2719);
Console.WriteLine(GetTickCount() - s1);  //單位毫秒

2 調(diào)用WIN API中的timeGetTime  推薦

[DllImport("winmm")]
static extern uint timeGetTime();

常用于多媒體定時器中,,與GetTickCount類似,,也是返回操作系統(tǒng)啟動到現(xiàn)在所經(jīng)過的毫秒數(shù),精度為1毫秒,。

一般默認(rèn)的精度不止1毫秒(不同操作系統(tǒng)有所不同),,需要調(diào)用timeBeginPeriod與timeEndPeriod來設(shè)置精度

[DllImport("winmm")]
static extern void timeBeginPeriod(int t);
[DllImport(
"winmm")]
static extern void timeEndPeriod(int t);

 缺點:與GetTickCount一樣,受返回值的最大位數(shù)限制,。

用法:

1
2
3
4
5
timeBeginPeriod(1);
uint start = timeGetTime();
Thread.Sleep(2719);
Console.WriteLine(timeGetTime() - start);  //單位毫秒
timeEndPeriod(1);

 3 調(diào)用.net自帶的方法System.Environment.TickCount

獲取系統(tǒng)啟動后經(jīng)過的毫秒數(shù),。經(jīng)反編譯猜測它可能也是調(diào)用的GetTickCount,但是它的返回值是int,,而GetTickCount與timeGetTime方法的原型中返回值是DWORD,對應(yīng)C#中的uint,,難道.NET對System.Environment.TickCount另外還做了什么處理么,?
缺點:與GetTickCount一樣,受返回值的最大位數(shù)限制,。

用法:

1
2
3
int aa = System.Environment.TickCount;
Thread.Sleep(2719);
Console.WriteLine(System.Environment.TickCount - aa); //單位毫秒

 

 :經(jīng)過測試,,發(fā)現(xiàn)GetTickCount、System.Environment.TickCount也可以用timeBeginPeriod與timeEndPeriod來設(shè)置精度,,最高可將精度提高到1毫秒,。不知是什么原因?

 4 調(diào)用WIN API中的QueryPerformanceCounter

[DllImport("kernel32.dll ")]
static extern bool QueryPerformanceCounter(ref long lpPerformanceCount);

用于得到高精度計時器(如果存在這樣的計時器)的值,。微軟對這個API解釋就是每秒鐘某個計數(shù)器增長的數(shù)值,。
如果安裝的硬件不支持高精度計時器,函數(shù)將返回false需要配合另一個API函數(shù)QueryPerformanceFrequency。

[DllImport("kernel32")]
static extern bool QueryPerformanceFrequency(ref long PerformanceFrequency);

 QueryPerformanceFrequency返回硬件支持的高精度計數(shù)器的頻率,,如果安裝的硬件不支持高精度計時器,函數(shù)將返回false,。

用法:

1
2
3
4
5
6
7
long a = 0;
QueryPerformanceFrequency(ref a);
long b = 0, c = 0;
QueryPerformanceCounter(ref b);
Thread.Sleep(2719);
QueryPerformanceCounter(ref c);
Console.WriteLine((c - b) / (decimal)a);  //單位秒

精度為百萬分之一秒。而且由于是long型,,所以不存在上面幾個API位數(shù)不夠的問題,。

缺點:在一篇文章看到,該API在節(jié)能模式的時候結(jié)果偏慢,,超頻模式的時候又偏快,,而且用電池和接電源的時候效果還不一樣(筆記本)
原文地址:http://delphi./viewthread.php?tid=1570
未經(jīng)過超頻等測試,如果是真的,,那該API出來的結(jié)果就可能不準(zhǔn),。

 5 使用.net的System.Diagnostics.Stopwatch類    推薦

Stopwatch 在基礎(chǔ)計時器機制中對計時器的刻度進行計數(shù),從而測量運行時間,。如果安裝的硬件和操作系統(tǒng)支持高分辨率性能的計數(shù)器,,則 Stopwatch 類將使用該計數(shù)器來測量運行時間,;否則,Stopwatch 類將使用系統(tǒng)計數(shù)器來測量運行時間,。使用 Frequency 和 IsHighResolution 兩個靜態(tài)字段可以確定實現(xiàn) Stopwatch 計時的精度和分辨率,。

實際上它里面就是將QueryPerformanceCounter、QueryPerformanceFrequency兩個WIN API封裝了一下,,如果硬件支持高精度,,就調(diào)用QueryPerformanceCounter,如果不支持就用DateTime.Ticks來計算,。

用法:

1
2
3
4
5
Stopwatch sw = new Stopwatch();
sw.Start();
Thread.Sleep(2719);
sw.Stop();
Console.WriteLine(sw.ElapsedTicks / (decimal)Stopwatch.Frequency);

6 使用CPU時間戳進行更高精度計時

原文地址:http://www./jh/23/110190.html

該方法的原理我不是很明白,,硬件知識太匱乏了。精度是ns

在C#中要用該方法必須先建立一個托管C++項目(因為要內(nèi)嵌匯編),,編譯成DLL供c#調(diào)用,,有點麻煩。

C++代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// MLTimerDot.h
  
#pragma once
  
using namespace System;
  
namespace MLTimerDot {
  
        //得到計算機啟動到現(xiàn)在的時鐘周期 
        unsigned __int64 GetCycleCount(void
        
                _asm  _emit 0x0F 
                _asm  _emit 0x31 
        
  
  
        //聲明 .NET 類 
        public __gc class MLTimer 
        
        public
                MLTimer(void
                
                        
                
  
                //計算時鐘周期
                UInt64 GetCount(void
                {
                        return GetCycleCount(); 
                
  
        }; 
}

C#調(diào)用:

1
2
3
4
5
6
7
long a = 0;
QueryPerformanceFrequency(ref a);
  
MLTimerDot.MLTimer timer = new MLTimerDot.MLTimer();
ulong ss= timer.GetCount();
Thread.Sleep(2719);
Console.WriteLine((timer.GetCount() - ss) / (decimal)a);

缺點:和QueryPerformanceCounter一樣,,結(jié)果不太穩(wěn)定,。

 

我的結(jié)論:常規(guī)應(yīng)用下timeGetTime完全夠用了,將精度調(diào)到1毫秒,,大部分境況都夠用,。System.Diagnostics.Stopwatch由于調(diào)用方便,也推薦使用,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多