2008-09-22 197 views
7

我是一個總新手,但我正在編寫一個在C#中處理字符串的小程序,我注意到如果我以不同的方式做了一些事情,代碼執行速度明顯加快。測試你的代碼速度?

所以它讓我想知道,你如何去計算你的代碼的執行速度?有沒有(免費)公用事業?你有沒有用System.Timer老式的做法,自己做?

回答

12

您所描述的內容稱爲性能分析。有很多程序可以執行此操作,例如Jetbrains profilerAnts profiler,但大多數程序會在您測量性能的過程中減慢應用程序的速度。

要手動進行自己的性能分析,可以使用System.Diagnostics.Stopwatch和簡單的Console.WriteLine,就像您所描述的一樣。還請記住,C#JIT編譯器會根據所調用的類型和頻率優化代碼,因此請仔細研究不同大小和循環的方法(例如遞歸調用),以獲得最佳效果。

+0

+1:該秒錶是快速檢查的便利小工具 - 謝謝! – 2009-05-29 10:55:57

0

我做了以下事情: 1)我使用ticks(例如在VB.Net Now.ticks中)來測量當前時間。我從已完成的滴答值中減去開始滴答,併除以TimeSpan.TicksPerSecond以獲得花費多少秒。 2)我避免了UI操作(如console.writeline)。 3)我通過一個實質性的循環運行代碼(如100,000次迭代)以儘可能地分解出使用/操作系統變量。

11

ANTS Profiler from RedGate是一個非常不錯的性能分析器。 dotTrace Profiler from JetBrains也很棒。這些工具將允許您查看可以在每條生產線上鑽取的性能指標。

螞蟻探查的卵石射擊: ANTS http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif

如果你想確保特定方法單元測試期間保持內的特定性能閾值,我會使用Stopwatch class監測方法中的一個礦的執行時間多次循環並計算平均值,然後結果爲Assert

+0

我們用這個。 95%的時間找到一個程序非常有效! – 2009-06-01 05:25:42

0

您可以使用StopWatch類來計時方法。記住,第一次通常是由於代碼必須被打亂而變慢。

7

只是提醒 - 確保在Relase中編譯,而不是調試! (我見過經驗豐富的開發人員犯了這個錯誤 - 很容易忘記)。

+0

我有點不同。爲了加速,最好在調試模式下工作。全部完成後,切換到釋放模式。原因是 - 如果代碼做的事情很愚蠢,比如調用某些必要的函數,或者分配/釋放更多需要的內存,或者做了你沒有意識到的I/O,釋放模式將無法修復它。它只會使它很難找到。 – 2015-07-27 16:13:29

2

你在描述什麼是'性能調整'。當我們談論性能調優時,有兩個角度。 (a)響應時間 - 執行特定請求/程序需要多長時間。 (b)吞吐量 - 一秒鐘內可以執行多少個請求。當我們通常'優化' - 當我們消除不必要的處理時,響應時間和吞吐量都會提高。但是,如果您在代碼中等待事件(如Thread.sleep(),I/O等待等),則響應時間受影響,但吞吐量不受影響。通過採用並行處理(產生多個線程),我們可以提高響應時間,但吞吐量不會提高。通常對於服務器端應用來說,響應時間和吞吐量都很重要。對於桌面應用程序(如IDE),吞吐量並不重要,只有響應時間非常重要。

您可以通過'性能測試'來測量響應時間 - 您只需記下所有關鍵事務的響應時間。您可以通過'負載測試'來測量吞吐量 - 您需要從足夠多的線程/客戶端連續抽取請求,以使服務器機器的CPU使用率爲80-90%。當我們提出請求時,我們需要保持不同交易之間的比率(稱爲交易組合) - 例如:在預訂系統中,每100次搜索就會有10次預訂。每10次預訂就會有一次取消。

確定交易需要調整響應時間(性能測試)後,您可以使用分析器確定熱點。 您可以通過比較該交易的響應時間*分數來確定吞吐量的熱點。假設在搜索,預訂,取消場景中,比例爲89:10:1。 響應時間爲0.1秒,10秒和15秒。 負載搜索 - 0.1 * .89 = 0.089 預訂負載 - 10 * .1 = 1 Cancell負載= 15 * .01 = 0.15 此處的調優預訂會對吞吐量產生最大的影響。 您還可以通過重複執行線程轉儲(對於基於Java的應用程序)來確定吞吐量的熱點。

0

本地.NET選項(適用於軟件開發人員的Team Edition)可能會解決一些性能分析需求。從2005年的.NET IDE菜單中,選擇工具 - >性能工具 - >性能嚮導......

[GSS可能是正確的,你必須有團隊版]

0

這對於測試代碼的運行速度簡單的例子。我希望我幫你

class Program { 
    static void Main(string[] args) { 
     const int steps = 10000; 
     Stopwatch sw = new Stopwatch(); 

     ArrayList list1 = new ArrayList(); 
     sw.Start(); 
     for(int i = 0; i < steps; i++) { 
      list1.Add(i); 
     } 
     sw.Stop(); 
     Console.WriteLine("ArrayList:\tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks); 

     MyList list2 = new MyList(); 
     sw.Start(); 
     for(int i = 0; i < steps; i++) { 
      list2.Add(i); 
     } 
     sw.Stop(); 
     Console.WriteLine("MyList: \tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);