將不確定變為確定~老趙寫的CodeTimer是代碼性能測試的利器

首先,非常感謝趙老大的CodeTimer,它讓我們更好的了解到代碼執行的性能,從而可以讓我們從性能的角度來考慮問題,有些東西可能我們認為是這樣的,但經理測試并非如何,這正應了我之前的那名話:“機器最能證明一切”!

費話就不說了,看代碼吧:

復制代碼
  1     /// <summary>2     /// 執行代碼規范3     /// </summary>4     public interface IAction5     {6         void Action();7     }8 9     /// <summary>10     /// 老趙的性能測試工具11     /// </summary>12     public static class CodeTimer13     {14         [DllImport("kernel32.dll", SetLastError = true)]15         static extern bool GetThreadTimes(IntPtr hThread, out long lpCreationTime, out long lpExitTime, out long lpKernelTime, out long lpUserTime);16 17         [DllImport("kernel32.dll")]18         static extern IntPtr GetCurrentThread();19         public delegate void ActionDelegate();20         private static long GetCurrentThreadTimes()21         {22             long l;23             long kernelTime, userTimer;24             GetThreadTimes(GetCurrentThread(), out l, out l, out kernelTime, out userTimer);25             return kernelTime + userTimer;26         }27         static CodeTimer()28         {29             Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;30             Thread.CurrentThread.Priority = ThreadPriority.Highest;31         }32         public static void Time(string name, int iteration, ActionDelegate action)33         {34             if (String.IsNullOrEmpty(name))35             {36                 return;37             }38             if (action == null)39             {40                 return;41             }42 43             //1. Print name44             ConsoleColor currentForeColor = Console.ForegroundColor;45             Console.ForegroundColor = ConsoleColor.Yellow;46             Console.WriteLine(name);47 48             // 2. Record the latest GC counts49             //GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);50             GC.Collect(GC.MaxGeneration);51             int[] gcCounts = new int[GC.MaxGeneration + 1];52             for (int i = 0; i <= GC.MaxGeneration; i++)53             {54                 gcCounts[i] = GC.CollectionCount(i);55             }56 57             // 3. Run action58             Stopwatch watch = new Stopwatch();59             watch.Start();60             long ticksFst = GetCurrentThreadTimes(); //100 nanosecond one tick61             for (int i = 0; i < iteration; i++) action();62             long ticks = GetCurrentThreadTimes() - ticksFst;63             watch.Stop();64 65             // 4. Print CPU66             Console.ForegroundColor = currentForeColor;67             Console.WriteLine("\tTime Elapsed:\t\t" +68                watch.ElapsedMilliseconds.ToString("N0") + "ms");69             Console.WriteLine("\tTime Elapsed (one time):" +70                (watch.ElapsedMilliseconds / iteration).ToString("N0") + "ms");71             Console.WriteLine("\tCPU time:\t\t" + (ticks * 100).ToString("N0")72                + "ns");73             Console.WriteLine("\tCPU time (one time):\t" + (ticks * 100 /74                iteration).ToString("N0") + "ns");75 76             // 5. Print GC77             for (int i = 0; i <= GC.MaxGeneration; i++)78             {79                 int count = GC.CollectionCount(i) - gcCounts[i];80                 Console.WriteLine("\tGen " + i + ": \t\t\t" + count);81             }82             Console.WriteLine();83         }84 85 86 87         public static void Time(string name, int iteration, IAction action)88         {89             if (String.IsNullOrEmpty(name))90             {91                 return;92             }93 94             if (action == null)95             {96                 return;97             }98 99             //1. Print name
100             ConsoleColor currentForeColor = Console.ForegroundColor;
101             Console.ForegroundColor = ConsoleColor.Yellow;
102             Console.WriteLine(name);
103 
104             // 2. Record the latest GC counts
105             //GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
106             GC.Collect(GC.MaxGeneration);
107             int[] gcCounts = new int[GC.MaxGeneration + 1];
108             for (int i = 0; i <= GC.MaxGeneration; i++)
109             {
110                 gcCounts[i] = GC.CollectionCount(i);
111             }
112 
113             // 3. Run action
114             Stopwatch watch = new Stopwatch();
115             watch.Start();
116             long ticksFst = GetCurrentThreadTimes(); //100 nanosecond one tick
117             for (int i = 0; i < iteration; i++) action.Action();
118             long ticks = GetCurrentThreadTimes() - ticksFst;
119             watch.Stop();
120 
121             // 4. Print CPU
122             Console.ForegroundColor = currentForeColor;
123             Console.WriteLine("\tTime Elapsed:\t\t" +
124                watch.ElapsedMilliseconds.ToString("N0") + "ms");
125             Console.WriteLine("\tTime Elapsed (one time):" +
126                (watch.ElapsedMilliseconds / iteration).ToString("N0") + "ms");
127             Console.WriteLine("\tCPU time:\t\t" + (ticks * 100).ToString("N0")
128                 + "ns");
129             Console.WriteLine("\tCPU time (one time):\t" + (ticks * 100 /
130                 iteration).ToString("N0") + "ns");
131 
132             // 5. Print GC
133             for (int i = 0; i <= GC.MaxGeneration; i++)
134             {
135                 int count = GC.CollectionCount(i) - gcCounts[i];
136                 Console.WriteLine("\tGen " + i + ": \t\t\t" + count);
137             }
138             Console.WriteLine();
139         }
140     }
復制代碼

有了上面的codeTimer我們就來測試一個吧,如字條串和并的問題,用+=還是用StringBuilder呢,有點經驗的程序員肯定說是StringBuilder,是的,確實是后者,那我們就來看看這

兩種方法測試的結果吧

復制代碼
 1      CodeTimer.Time("String  Concat", 100000,2                  () =>3                  {4                      var s = "1";5                      for (int i = 1; i < 10; i++)6                          s = s + "1";7                  });8 9       CodeTimer.Time("StringBuilder Concat", 100000,
10                () =>
11                {
12                    var s = new StringBuilder();
13                    for (int i = 1; i < 10; i++)
14                        s.Append("1");
15                });
復制代碼

測試的結果如下:

從圖中我們可以看到StringBuilder快的很明顯,無論是執行時間,還是對CPU的消耗及GC回收都遠低于String的拼結,所以,才有以下結論:

在字符串拼結時,請使用StringBuilder吧!

轉載于:https://www.cnblogs.com/jjg0519/p/8309590.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284432.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284432.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284432.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

聊聊 C++ 中的幾種智能指針(下)

一&#xff1a;背景 上一篇我們聊到了C 的 auto_ptr &#xff0c;有朋友說已經在 C 17 中被棄用了&#xff0c;感謝朋友提醒&#xff0c;今天我們來聊一下 C 11 中引入的幾個智能指針。unique_ptrshared_ptrweak_ptr看看它們都怎么玩。二&#xff1a;三大智能指針詳解 1. uniq…

iOS回顧筆記( 02 ) -- 由九宮格布局引發的一系列“慘案”

iOS回顧筆記&#xff08; 02 &#xff09; -- 由九宮格布局引發的一系列“慘案” 前言&#xff08;扯幾句淡先&#xff09; 回顧到學習UI過程中的九宮格布局時&#xff0c;發現當時學的東西真是不少。 這個階段最大的特點就是&#xff1a;知識點繁多且瑣碎。 我們的目標就是要將…

【GlobalMapper精品教程】007:如何加載谷歌衛星影像?

“Global Mapper支持所有OGC標準數據源類型,例如用于流式柵格地圖的WMS / WMTS,用于矢量數據集的WFS和用于為指定區域下載單個數據文件的WCS。預先切片的圖像和地形數據集也可以使用OSM(OpenStreetMaps)、TMS(Tiled Map Service)和Google Maps瓦片架構支持。您只需要選擇適當…

LVS/keepalived配置

LVS/DR keepalived配置注意&#xff1a;前面雖然我們已經配置過一些操作&#xff0c;但是下面我們使用keepaliave操作和之前的操作是有些沖突的&#xff0c;所以若是之前配置過DR&#xff0c;請首先做如下操作&#xff1a;dr上執行&#xff1a;$ipv -Cifconfig eth0:0 down前…

Mysql清空表(truncate)與刪除表中數據(delete)的區別

2019獨角獸企業重金招聘Python工程師標準>>> 為某基于wordpress搭建的博客長久未除草&#xff0c;某天升級的時候發現已經被插入了幾萬條垃圾留言&#xff0c;如果一條條刪除那可真是累人的活。遂考慮直接進入mysql直接清空表或者刪除表中數據。 本文記錄一下這2種操…

[轉]云原生到底是什么?

&#x1f4cb; 個人簡介 &#x1f496; 作者簡介&#xff1a;大家好&#xff0c;我是阿牛&#x1f61c; &#x1f4dd; 個人主頁&#xff1a;館主阿牛&#x1f525; &#x1f389; 支持我&#xff1a;點贊&#x1f44d;收藏??留言&#x1f4dd; &#x1f4ac;格言&#xf…

【GlobalMapper精品教程】008:如何根據指定區域(shp、kml、cad)下載衛星影像?

本文講解在Globalmapper中根據指定的范圍(shp、kml、cad等格式)進行在線衛星影像的下載方法。 文章目錄 一、根據shp范圍下載谷歌影像1. 加載谷歌影像2. 加載shp矢量范圍3. 根據范圍導出影像二、根據kml范圍下載谷歌影像1. 生成研究區范圍kml2. 根據kml范圍下載影像三、根據CAD…

膛目結舌的代碼技巧!一看就是冷暴力~~~~

你見過哪些令你膛目結舌的代碼技巧&#xff1f; 代碼世界有很多令人大呼小叫的技巧&#xff01;有的代碼像魔術師一樣巧妙地隱藏了自己&#xff0c;有的像魔法師一樣讓你眼花繚亂&#xff0c;還有的像瑜伽大師一樣靈活自如。它們讓我們驚嘆不已&#xff0c;讓我們覺得自己仿佛置…

聯合線程

聯合線程實際上就是把多線程又聯合成了一個線程&#xff0c;但這里還是要比單線程靈活很多&#xff0c;比如說&#xff0c;我可以讓一個線程到運行到某一個條件再聯合其他線程。當前線程與其他線程聯合在一起&#xff0c;又一種讓出cpu&#xff0c;而且直到別個線程運行完&…

Kafka學習征途:不再依賴ZK的KRaft

【Kafka】| 總結/Edison Zhou1新的KRaft架構在Kafka 2.8之前&#xff0c;Kafka重度依賴于Zookeeper集群做元數據管理和集群的高可用&#xff08;即所謂的共識服務&#xff09;。在Kafka 2.8之后&#xff0c;引入了基于Raft協議的KRaft模式&#xff0c;支持取消對Zookeeper的依賴…

探索java世界中的日志奧秘

java日志簡單介紹 對于一個應用程序來說日志記錄是必不可少的一部分。線上問題追蹤&#xff0c;基于日志的業務邏輯統計分析等都離不日志。JAVA領域存在多種日志框架&#xff0c;目前常用的日志框架包括Log4j&#xff0c;Log4j 2&#xff0c;Commons Logging&#xff0c;Slf4j&…

nginx的負載均衡集群

針對域名:vim /usr/local/nginx/conf/vhosts/lb.conf //自定義名稱upstream xrc { //別名server 192.168.0.1:80 weight2; //包含的主機server,負載均衡里面的機器server 192.168.0.2:80 weight1; //權重weight}server {li…

英語名言警句100句

1、寧為百夫長&#xff0c;勝作一書生。——楊炯 Better be a centurion than a scholar. 2、我是閑暇為所有中最的。——蘇格拉底 I am the most leisure of all. 3、立志不堅&#xff0c;終不濟事。——朱熹 If you are not determined, you will not help. 4、人學始知道&am…

RabbitMQ細說之開篇

前言關于消息中間件的應用場景&#xff0c;小伙伴們應該都耳熟能詳了吧&#xff0c;比如經常提到的削峰填谷、分布式事務、異步業務處理、大數據分析等等&#xff0c;分布式消息隊列成為其中比較關鍵的橋梁&#xff0c;也就意味著小伙伴們得掌握相關技能&#xff1b;當下相對比…

【Java】五種常見排序之-----------冒泡排序

冒泡排序&#xff1a; 原理: 將關鍵字較小的值不斷地上浮&#xff0c;將關鍵字值較大的不斷下沉&#xff1b;時間復雜度&#xff1a;O(n^2)空間復雜度&#xff1a;最優&#xff08;即已經排好序&#xff09;為0&#xff0c;平均空間復雜度為O(1);核心代碼&#xff1a;for(int i…

混戰的低代碼江湖,如何區分「李逵」和「李鬼」?

作者&#xff1a;APICloud 創始人劉鑫 這兩年&#xff0c;無論是資本層面&#xff0c;還是企業IT部門的關注&#xff0c;“低代碼”都是絕對的熱點。互聯網圈也似在一夜之間冒出了各種各樣的低代碼公司。 到底什么是低代碼&#xff1f;低代碼是新技術么&#xff1f;低代碼開發能…

關于捕獲鍵盤信息的processDialogkey方法2--具體應用

自定義控件里的keydown方法無法捕獲所有的按鍵消息的處理方法1&#xff08;自定義控件里的keydown方法無法獲取的鍵值如上下左右鍵等&#xff09; 處理辦法具體如下&#xff1a; 1、首先在自定義控件UserControl1中重寫ProcessDialogKey方法 自定義控件UserControl1中重寫Proce…

指針

指針 題目一&#xff1a; 計算兩數的和與差 本題要求實現一個計算輸入的兩數的和與差的簡單函數。 函數接口定義&#xff1a; void sum_diff( float op1, float op2, float psum, float pdiff ); 其中op1和op2是輸入的兩個實數&#xff0c;psum和pdiff是計算得出的和與差。 裁判…

【MapGIS精品教程】006:MapGIS根據經緯度計算各比例尺圖幅編號

己知某點的經緯度或圖幅西南圖廓點的經緯度,計算該點所在圖幅號。 例題一:某點的經度為11433′45″,緯度為3922′30″,計算所在1:250000圖幅的編號。 文章目錄 1. 公式計算編號的方法2. 軟件計算編號的方法1. 公式計算編號的方法 求解過程: 第一步,利用下列公式計算其所…

寫出一個緩存系統的偽代碼001

/*** 寫出一個緩存系統的偽代碼*/ public class CacheDemo {private Map<String, Object> map new HashMap<String, Object>();public static void main(String[] args) {// TODO Auto-generated method stub} public synchronized Object getData(String key)…