8天玩轉並行開發——第八天 用VS性能向導解剖你的程序


     

     最后一篇,我們來說說vs的“性能向導",通常我們調試程序的性能一般會使用Stopwatch,如果希望更加系統的了解程序,我們就需要

用到”性能向導“,通過性能報告便於我們快速的發現並找到潛在的性能問題。

 

首先我們上一段需要改進的代碼:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Diagnostics;
 6 
 7 namespace Test
 8 {
 9     class Program
10     {
11         static object obj = new object();
12 
13         static void Main(string[] args)
14         {
15             var watch = Stopwatch.StartNew();
16 
17             var range = ParallelEnumerable.Range(1, 100000000);
18 
19             var query = (from n in range.AsParallel()
20                          where n % 5 == 0
21                          select Calculate(n)).Average();
22 
23             watch.Stop();
24 
25             Debug.WriteLine("耗費時間:{0}", watch.Elapsed);
26             Console.WriteLine("耗費時間:{0}", watch.Elapsed);
27         }
28 
29         /// <summary>
30         /// 模擬復雜的數學計算
31         /// </summary>
32         /// <param name="num"></param>
33         /// <returns></returns>
34         static double Calculate(int num)
35         {
36             lock (obj)
37             {
38                 var sqrt = Math.Sqrt(num);
39 
40                 var pow = Math.Pow(sqrt, 5);
41 
42                 var log10 = Math.Log10(pow);
43 
44                 var floor = Math.Floor(log10);
45 
46                 return floor;
47             }
48         }
49     }
50 }

 

記住,我們的程序需要改成Release版本,因為這里包含了太多的優化信息。

 

找到”工具欄”->"分析"->"啟動性能向導",選中“並發”->"可視化多線程應用程序的行為"。

然后選中我們的程序Test

 

最后點擊完成,如果是第一次使用的話會提示你“是否立即配置符號”,這是因為我們的並行計算用到了window函數,所以我們調試的時候

需要加載這些符號。點擊“是”,然后勾選“MicroSoft符號服務器”,點擊確定就OK了。

 

稍等一會,我們會看到三種視圖:CPU使用率,線程,內核。

然后我們進入“CPU使用率”,看看情況。

從圖中:我們可以獲知如下信息:

①:從圖中的綠色破浪線可以看出,我們的程序確實是多核計算。

②:並行計算耗時16515ms,平均CPU使用率:39%。,這里要注意,性能剖析器也需要耗費CPU周期,所以執行時間要稍大於實際時間。

 

然后,我們點擊“線程“tab,看看效果

 

通過點擊各個”線程”的綠色小條,然后看下“分析報告”:發現程序被三個task承載執行:主線程(644),輔助線程(4824),輔助線程(1564)。

 

然后我們點擊“可見時間線分析”中的“同步”,看看同步是由誰貢獻出來的,清楚的看到Monitor.Enter,這是因為我的代碼里面有lock。

而且阻塞時間還是蠻厲害的,這里就是我們可以優化的點。

 

接下來,我們看看“核心”標簽

這個標簽給我們展示的是:各個線程是如何的映射到可用邏輯處理器內核的,具體的也沒有什么好說的。

 

剛才也說了,我們程序的Monitor那一塊是一個優化點,仔細論證代碼,我們發現lock鎖是多余的,接下來我們要做的事情就是去掉lock,

然后看看效果:

 

 1         static double Calculate(int num)
 2         {
 3                 var sqrt = Math.Sqrt(num);
 4 
 5                 var pow = Math.Pow(sqrt, 5);
 6 
 7                 var log10 = Math.Log10(pow);
 8 
 9                 var floor = Math.Floor(log10);
10 
11                 return floor;
12         }

 

 

最后我們發現,程序的執行時間確實加速了。不過這里面還有很多的東西等待挖掘,我也就簡單的分析到此了。

最后希望大家能夠在此系列中獲取一絲營養。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM