2016-12-04 48 views
0

我試圖實現一個性能監視工具,我想監視基本的東西,如內存和CPU。性能計數器讀訪問非常慢 - 任務管理器如何執行它?

我試圖這樣做,通過使用性能計數器,因爲我相信這是任務管理器在幕後使用的。我不知道任務管理器是如何能夠做到這一點卻因爲對我來說,似乎需要很長的時間使用此方法來檢索進程數據:

class Program 
    { 
     static void Main(string[] args) 
     { 
      while (true) 
      { 
       var pcs = Process.GetProcesses() 
        .Select(p => new PerformanceCounter("Process", "Working Set - Private", p.ProcessName)); 

       var sw = Stopwatch.StartNew(); 

       foreach (var pc in pcs) 
        pc.NextValue(); 

       Console.WriteLine($"Time taken to read {pcs.Count()} performance counters: {sw.ElapsedMilliseconds}ms"); 

       Thread.Sleep(1000); 
      } 
     } 
    } 

enter image description here

有沒有人有任何建議如何做到這一點,甚至如何甚至任務管理器或進程資源管理器能夠做到這一點?

+0

您是否嘗試在未調試的情況下運行?調試可能會顯着影響LINQ語句的性能。 (只是猜測) –

+0

任務管理器和Process Explorer使用較低級別的語言編寫(最有可能是C++) –

+2

任務管理器不會在更新循環內創建新的PerformanceCounter實例。將它移出並在最後添加一個'.ToList()',我敢打賭你會看到更低的時間。 –

回答

0

任務管理器如何做到這一點?

他用來電ZwQuerySystemInformationZwQueryInformationProcessZwQueryInformationThread .. 任務管理器保持活動進程的數據庫,並通過調用ZwQuerySystemInformation(SystemProcessInformation,)定期更新此信息 - 退出的SYSTEM_PROCESS_INFORMATION所以得了陣列。 添加新條目,如果發現新進程,但不在DB中,刪除死亡進程的條目,更新生活信息 SYSTEM_PROCESS_INFORMATION已包含大量進程信息。如果你想實現一個沒有「量子效應」的性能監測工具(當測量影響到狀態本身),你需要使用這個ntdll api。如果你想要實現一個沒有「量子效應」的性能監測工具,你需要使用這個ntdll api。對於定義看看http://processhacker.sourceforge.net/doc/ntexapi_8h_source.html 儘管這是沒有文檔,現有的功能和結構沒有改變從win2000(如此~17年)如何最低 - 新版本的Windows添加了很多新的信息類,有些字段是在舊版本中備用/未使用 - 可以使用,但舊的(遺留)未更改

+0

評論不適用於擴展討論;這個對話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/129903/discussion-on-answer-by-rbmm-performance-counter-read-access-very-slow-how-doe) 。 –

+0

我會接受這個作爲正確的答案,因爲即使我沒有得到一個令人滿意的答案,我如何以高性能的方式做到這一點,它確實回答了我的問題,如何任務管理器能夠做到這一點。 – mikeysee

+0

@mikeysee - 我可以建議你從調用'ZwQuerySystemInformation(SystemProcessInformation,*)'開始,返回時你得到了'SYSTEM_PROCESS_INFORMATION'數組 - 每個進程有一個(從虛擬空閒進程開始),每個進程都有很多信息名稱,線程數量,內存使用情況,創建時間,I/O數量等) - 所以不要調用任何託管功能,但只有這一點,並尋找性能。無論如何這是一個很好的學習測試。我可以爲此顯示代碼,但只能在'C++'中顯示 – RbMm