2010-03-09 45 views
7

我已經被問及如何找出我的程序使用了多少內存和CPU,並且我被提到了性能計數器。但是,當我查看文檔時,它首先告訴我通過爲我的應用程序創建清單來提供消費者數據,並且我的眼睛掠過。我想,這樣的通用工具在那裏很好,但我想要的只是一組函數,它們會告訴我我的程序使用了多少內存和CPU。性能是否適合我的工作?如果是這樣,我該如何使用它們?

性能是否適合我的工作?如果是這樣,我該如何使用它們?我真的不想在C#應用程序之外設置任何東西。

注:我不是在尋找第三方分析應用程序,我需要讓我的應用程序顯示內存和CPU數據。

更新:我已經刪除了函數中的時間,因爲它似乎混淆了這個問題。

+0

「我不是在尋找第三方分析應用程序,我需要在我的應用程序中有數據」 - 這對我沒有意義嗎? – 2010-03-09 14:48:58

+0

您正在討論一個分析器。要麼使用Visual Studio中內置的那個(如果你有這個版本),要麼使用像memprofiler這樣的東西。 – 2010-03-09 14:50:30

+0

@Mitch:現在問題更清楚了嗎? – Simon 2010-03-09 14:59:06

回答

1

性能計數器不會告訴你你的應用程序在一個函數中花了多少時間。爲此,您可以使用某種計時器類,您可以在函數的開始處開始並在結束時停止。

+0

是不是像添加DateTime start = DateTime.Now一樣簡單;和DateTime結束= DateTime.Now;在函數的開始和結束?或者在它運行之前和之後。然後做TimeSpan timespent = end - start;並做一些日誌記錄或有價值的東西。 – Alxandr 2010-03-09 14:56:32

+0

@shoosh:好的,其餘的呢? – Simon 2010-03-09 14:59:52

+0

@Alxandr:毫秒準確度是不夠的,使用秒錶獲得更好的分辨率需要很長的時間,以致數值出現偏差。 – Simon 2010-03-10 09:16:16

3

您可以使用perfmon開箱即用來監視CPU,內存和磁盤使用情況以及許多.NET特定的性能計數器。 perfmon自帶窗戶。

只有當你想寫自己的perfmon,或者如果你想提供你自己的性能計數器,眼睛釉是必需的。只有當你的用戶需要監視這個值時(例如你正在開發一個服務器應用程序,並且你的用戶需要確保由於月相無效而拒絕的連接數不超過10%),後者纔會很有趣。

要確定您在某些功能中花費了多少時間,請使用分析器。


性能計數器API將允許你一起監測數據與現有的性能計數器(這可能會告訴你,例如該功能Foo 11後每天晚上很慢變,因爲一些其他進程顛簸盤),和監視器可以作爲服務運行並生成日誌文件供以後分析。

您必須弄清楚這些好處是否值得性能計數器的額外麻煩,或者如果您最好使用日誌記錄系統。

有相當一些樣品out there,可能會讓你更容易。但是,瞭解架構和「官方」術語仍然值得。通常,MS API的需要大量的閱讀和尋找一些很好的包裝代碼,這並不意味着他們總是痛苦的。

+0

我有效地想寫我自己的perfmon,但只適用於我的應用程序。它需要顯示自己的CPU和內存使用情況。 – Simon 2010-03-09 15:07:26

+0

@Simon:我已經更新了答案。 – peterchen 2010-03-09 15:29:32

+0

謝謝 - 特別是SystemMonitor項目看起來很不錯。 – Simon 2010-03-09 16:20:29

0

是多少時間在功能

花費爲此,您需要一個分析器(如Visual Studio中的更先進的版本包括一個)。這會給你詳細說明每個方法被調用的次數(有或沒有它調用的函數)。

識別瓶頸的基本細節。

CPU

總過程CPU-秒性能計數器(或列在任務管理或處理資源管理器)將這個給你。在實踐中,您可能需要更多可用的細節(內核與用戶時間)。

內存

這是困難的部分......「記憶」可以指:分配的虛擬地址空間,致力於虛擬地址空間,工作集,高峯工作組,專用內存,..

您可能需要花一些時間來使用Windows內部或類似的參考資料,以瞭解它們在開始任何實際分析之前是如何不同以及它們的含義。

+0

我將如何去尋找「總進程CPU秒性能計數器」? – Simon 2010-03-09 14:59:36

+0

@Simon:在perfmon下進行。 – Richard 2010-03-09 16:38:18

+0

@Richard:我的意思是,我將如何從我的應用程序中使用它? – Simon 2010-03-09 17:00:31

3

假設CPU使用率和內存(進程工作集)的單個實例應用程序,你可以這樣做以下:

public static void Main(string[] args) 
{ 
    string processName = Process.GetCurrentProcess().ProcessName; 
    int processorCount = Environment.ProcessorCount; 

    // Simulate process usage 
    for (int i = 0; i < processorCount * 2; i++) 
    { 
     var t = new Thread(() => 
      { 
       while (true) { Console.WriteLine("Busy..."); } 
      }); 

     t.IsBackground = true; 
     t.Start(); 
    } 

    var cpu = new PerformanceCounter("Process", "% Processor Time"); 
    cpu.InstanceName = processName; 
    cpu.NextValue(); 

    var ram = new PerformanceCounter("Process", "Working Set"); 
    ram.InstanceName = processName; 

    float memUsage = (ram.NextValue()/1024)/1024; 
    Console.WriteLine("Memory Usage: {0}MB", memUsage); 

    float cpuUsage = cpu.NextValue()/(float)processorCount; 
    Console.WriteLine("CPU Usage: {0}%", cpuUsage); 
} 

對於CPU使用率性能計數器第一次調用NextValue返回0,所以只有第二次調用用於顯示值。報告的使用量是所有機器處理器的總和,因此在顯示之前計算平均值。

2

對於簡單的信息,看看從你的C#代碼中的這些值,然後選擇什麼是你最相關的:

 
System.Diagnostics.Process.GetCurrentProcess().TotalProcessorTime 
System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64 
System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize64 
System.GC.GetTotalMemory(false) 

PrivateMemorySize是總的專用字節(託管和非託管合併)爲您的流程。 GetTotalMemory爲您提供應用程序的託管內存使用總量,傳遞true將在獲取該值之前強制執行GC。

+0

看起來不錯 - CPU呢? – Simon 2010-03-10 09:14:48

+0

我不知道是否有任何關於當前即時CPU使用情況的信息,但TotalProcessorTime會爲您提供整個Process的使用時間。如果您所追求的是CPU使用率的即時報告,則必須查看性能計數器或WMI。 – 2010-03-10 11:32:51

相關問題