最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用C# Stopwatch 測量微秒級(jí)精確度

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

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

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

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

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

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

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

第二版改用ElapsedTicks * 1000000F / Stopwatch.Frequency 計(jì)算微秒(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é)果的第一次時(shí)間偏長問題消失,而也呈現(xiàn)出SHA1 比MD5 計(jì)算耗時(shí)的證據(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

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

    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 測量微秒精確度的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Unity實(shí)現(xiàn)大轉(zhuǎn)盤的簡單筆記

    Unity實(shí)現(xiàn)大轉(zhuǎn)盤的簡單筆記

    這篇文章主要為大家分享了Unity實(shí)現(xiàn)大轉(zhuǎn)盤的簡單筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 詳解C#多線程之線程同步

    詳解C#多線程之線程同步

    本文主要介紹了C#線程同步的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • C#中三種Timer計(jì)時(shí)器的詳細(xì)用法

    C#中三種Timer計(jì)時(shí)器的詳細(xì)用法

    這篇文章介紹了C#中三種Timer計(jì)時(shí)器的詳細(xì)用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C# List介紹及具體用法

    C# List介紹及具體用法

    這篇文章主要介紹了C# List介紹及具體用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C# 中的委托詳細(xì)解析與完整應(yīng)用小結(jié)

    C# 中的委托詳細(xì)解析與完整應(yīng)用小結(jié)

    C#委托是一種類型安全的函數(shù)指針,允許將方法作為參數(shù)傳遞或賦值給變量,它在事件處理、回調(diào)和異步編程中廣泛應(yīng)用,本文詳細(xì)介紹了委托的基本概念、用法和高級(jí)應(yīng)用,感興趣的朋友一起看看吧
    2025-03-03
  • 字符串陣列String[]轉(zhuǎn)換為整型陣列Int[]的實(shí)例

    字符串陣列String[]轉(zhuǎn)換為整型陣列Int[]的實(shí)例

    下面小編就為大家分享一篇字符串陣列String[]轉(zhuǎn)換為整型陣列Int[]的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C#使用webbrowser的常見用法實(shí)例

    C#使用webbrowser的常見用法實(shí)例

    這篇文章主要介紹了C#使用webbrowser的常見用法,涉及C#使用webbrowser實(shí)現(xiàn)判斷網(wǎng)絡(luò)連接、模擬登陸、點(diǎn)擊等常用技巧,需要的朋友可以參考下
    2015-08-08
  • C#控制鍵盤按鍵的常用方法

    C#控制鍵盤按鍵的常用方法

    這篇文章主要介紹了C#控制鍵盤按鍵的常用方法,涉及C#針對(duì)鍵盤大寫、滾動(dòng)、數(shù)字的開啟與鎖定等功能,非常簡單實(shí)用,需要的朋友可以參考下
    2015-05-05
  • C# 獲取 PC 序列號(hào)的方法示例

    C# 獲取 PC 序列號(hào)的方法示例

    這篇文章主要介紹了C# 獲取 PC 序列號(hào)的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • C#中CompareTo的用法小結(jié)

    C#中CompareTo的用法小結(jié)

    CompareTo方法通常用于比較當(dāng)前對(duì)象與另一個(gè)對(duì)象的順序,本文主要介紹了C#中CompareTo的用法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04

最新評(píng)論

衢州市| 马边| 定南县| 南丰县| 洛浦县| 承德县| 杨浦区| 康平县| 濮阳市| 太仆寺旗| 宜宾市| 堆龙德庆县| 海林市| 徐汇区| 石景山区| 民乐县| 台前县| 浪卡子县| 泰和县| 贵定县| 河北区| 东台市| 泌阳县| 务川| 台安县| 辽宁省| 随州市| 会理县| 甘泉县| 灌南县| 库车县| 毕节市| 射洪县| 定边县| 新安县| 淳安县| 福泉市| 哈尔滨市| 长岭县| 贺州市| 遂川县|