欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用C# Stopwatch 測量微秒級精確度

 更新時間:2021年03月04日 09:44:44   作者:黑暗執(zhí)行緒  
這篇文章主要介紹了如何使用C# Stopwatch 測量微秒精確度,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

跟同事討論到- 用C# Stopwatch 取得效能數(shù)值,Stopwatch.ElapsedMilliseconds 只到毫秒(ms),如果需要更高的時間精確度(微秒μs,甚至奈秒ns),該怎么做?

原以為要費番功夫,在Stackoverlow查到討論,答案意外地簡單。

準(zhǔn)備測試程式如下,比較MD5 及SHA1 計算1MB byte[] 雜湊值所秏費時間:

static byte[] data = new byte[1024 * 1024];
static void Main(string[] args)
{
  Test1();
  Console.ReadLine();
}

private static void Test1()
{
  Console.WriteLine("Test 1");
  for (var i = 0; i < 5; i++)
  {
    Stopwatch sw = new Stopwatch();
    sw.Start();
    var md5 = MD5.Create().ComputeHash(data);
    sw.Stop();
    Console.WriteLine($"MD5 {sw.ElapsedMilliseconds}ms");
    sw.Restart();
    var sha1 = SHA1.Create().ComputeHash(data);
    sw.Stop();
    Console.WriteLine($"SHA1 {sw.ElapsedMilliseconds}ms");
  }
}

執(zhí)行結(jié)果如下:

Test 1
MD5 10ms
SHA1 2ms
MD5 2ms
SHA1 2ms
MD5 2ms
SHA1 2ms
MD5 2ms
SHA1 2ms
MD5 2ms
SHA1 2ms

有兩個問題,第一是回圈的第一次執(zhí)行因涉及.NET 初始化,耗時會異常偏高(先做SHA1 再做MD5,就變成第一筆SHA1 超過10ms),第二是MD5 與SHA1 執(zhí)行時間相近,都是2ms 多,用ElapsedMilliseconds 看不出差異。

針對首次數(shù)值耗時偏差問題,除了略過第一次數(shù)據(jù)不計,我想到的另一個解法是在Test1()前先跑一次MD5.Create()完成相關(guān)初始化。至于ElapsedMilliseconds看不出差異問題,改用ElapsedTicks是種解法,但要注意,ElaspedTicks換算成時間單位時,不是除以TimeSpan.TicksPerMillisecond而是依CPU頻率而定,需使用Stopwatch.Frequency (每秒Tick數(shù))。

第二版改用ElapsedTicks * 1000000F / Stopwatch.Frequency 計算微秒(Microsecond, μs),執(zhí)行前先MD5.Create() 暖機(jī)。

static byte[] data = new byte[1024 * 1024];
static void Main(string[] args)
{
  MD5.Create();
  Test2();
  Console.ReadLine();
}

private static void Test2()
{
  Console.WriteLine("Test 2");
  for (var i = 0; i < 5; i++)
  {
    Stopwatch sw = new Stopwatch();
    sw.Start();
    var md5 = MD5.Create().ComputeHash(data);
    sw.Stop();
    //
    Console.WriteLine($"MD5 {sw.ElapsedTicks * 1000000F / Stopwatch.Frequency:n3}μs");
    sw.Restart();
    var sha1 = SHA1.Create().ComputeHash(data);
    sw.Stop();
    Console.WriteLine($"SHA1 {sw.ElapsedTicks * 1000000F / Stopwatch.Frequency:n3}μs");
  }
}

執(zhí)行結(jié)果的第一次時間偏長問題消失,而也呈現(xiàn)出SHA1 比MD5 計算耗時的證據(jù)。而由數(shù)值來看,精確度可到0.1μs = 100ns。

Test 2
MD5 2,402.200μs
SHA1 2,724.000μs
MD5 2,017.300μs
SHA1 2,576.900μs
MD5 2,102.100μs
SHA1 2,578.700μs
MD5 2,024.100μs
SHA1 2,600.300μs
MD5 2,008.300μs
SHA1 2,624.300μs

自己計算麻煩了點,Stopwatch 有個Elapsed 屬性,型別為TimeSpan,其中TotalMilliseconds 屬性精確度即可達(dá)到μs 及100ns。請看第三版:

    static byte[] data = new byte[1024 * 1024];
    static void Main(string[] args)
    {
      MD5.Create();
      Test3();
      Console.ReadLine();
    }
    private static void Test3()
    {
      Console.WriteLine("Test 3");
      for (var i = 0; i < 5; i++)
      {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        var md5 = MD5.Create().ComputeHash(data);
        sw.Stop();
        Console.WriteLine($"MD5 {sw.Elapsed.TotalMilliseconds * 1000:n3}μs");
        sw.Restart();
        var sha1 = SHA1.Create().ComputeHash(data);
        sw.Stop();
        Console.WriteLine($"SHA1 {sw.Elapsed.TotalMilliseconds * 1000:n3}μs");
      }
    }

執(zhí)行結(jié)果與第二版相同,但程式更簡單一些。

Test 3
MD5 2,423.400μs
SHA1 2,692.400μs
MD5 2,204.000μs
SHA1 2,976.800μs
MD5 2,094.500μs
SHA1 2,588.600μs
MD5 2,034.600μs
SHA1 2,598.900μs
MD5 2,029.900μs
SHA1 2,887.000μs

以上就是如何使用C# Stopwatch 測量微秒精確度的詳細(xì)內(nèi)容,更多關(guān)于C# Stopwatch 測量微秒精確度的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 分析C# Dictionary的實現(xiàn)原理

    分析C# Dictionary的實現(xiàn)原理

    對于C#中的Dictionary類相信大家都不陌生,這是一個Collection(集合)類型,可以通過Key/Value(鍵值對的形式來存放數(shù)據(jù);該類最大的優(yōu)點就是它查找元素的時間復(fù)雜度接近O(1)。那么什么樣的設(shè)計能使得Dictionary類實現(xiàn)O(1)的時間復(fù)雜度呢
    2021-06-06
  • C#連接Oracle數(shù)據(jù)庫的實例方法

    C#連接Oracle數(shù)據(jù)庫的實例方法

    C#連接Oracle數(shù)據(jù)庫的實例方法,需要的朋友可以參考一下
    2013-04-04
  • C#6 null 條件運算符

    C#6 null 條件運算符

    本文主要對比C# 6 null運算符與老版本的不同,并且用代碼實例測試,發(fā)現(xiàn)新語法性能提高,語法簡化了。希望看到的同學(xué)對你有所幫助
    2016-07-07
  • C#圖片添加水印的實現(xiàn)代碼

    C#圖片添加水印的實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C#給圖片添加水印的實現(xiàn)代碼,不僅可以為圖片加文字水印,還可以判斷是否是圖片文件,感興趣的小伙伴們可以參考一下
    2016-02-02
  • c#中利用委托反射將DataTable轉(zhuǎn)換為實體集的代碼

    c#中利用委托反射將DataTable轉(zhuǎn)換為實體集的代碼

    c#中利用委托反射將DataTable轉(zhuǎn)換為實體集的代碼,需要的朋友可以參考下
    2012-10-10
  • C#自定義的字符串操作增強(qiáng)類實例

    C#自定義的字符串操作增強(qiáng)類實例

    這篇文章主要介紹了C#自定義的字符串操作增強(qiáng)類,涉及C#操作字符串實現(xiàn)分割、轉(zhuǎn)換、去重等常用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • c#構(gòu)造ColorComboBox(顏色下拉框)

    c#構(gòu)造ColorComboBox(顏色下拉框)

    這篇文章主要介紹了c#構(gòu)造ColorComboBox的代碼分享,大家參考使用吧
    2013-12-12
  • C#反射內(nèi)存的處理分析

    C#反射內(nèi)存的處理分析

    這篇文章主要介紹了C#反射內(nèi)存的處理,較為詳細(xì)的分析了反射加載的內(nèi)存釋放問題,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • DevExpress實現(xiàn)GridControl列頭繪制Checkbox的方法

    DevExpress實現(xiàn)GridControl列頭繪制Checkbox的方法

    這篇文章主要介紹了DevExpress實現(xiàn)GridControl列頭繪制Checkbox的方法,需要的朋友可以參考下
    2014-08-08
  • C#異步編程由淺入深(二)之Async/Await的使用

    C#異步編程由淺入深(二)之Async/Await的使用

    這篇文章主要介紹了C#異步編程由淺入深(二)之Async/Await的作用,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03

最新評論