簡體   English   中英

C#中的多線程CPU使用率

[英]multi-thread CPU usage in C#

我的程序使用預定數量的線程,每個線程都執行獨立工作。 我使用i7-2600 CPU,但我關閉了超線程模塊,因此它在4個內核上運行4個線程。 當我使用1個線程運行程序時,CPU使用率為25%,這是完全使用1個線程的完美,但是當我運行4或3個線程時,我只獲得60%的CPU,為什么?

就像我之前提到的那樣,線程是完全獨立的(沒有鎖和沒有爭論)當我用1個線程運行程序4次時,我獲得了100%的CPU使用率(即,當每個進程的4個進程為1個線程時,我得到了正確的CPU使用率)

有任何想法嗎?

更多信息:

  1. 在處理所有需要的數據時,我沒有使用I / O加載到內存中,每個線程在處理之前加載自己的數據。
  2. 我從數據庫加載數據(使用oleDb),但我正在描述的問題發生在加載后所有線程都在處理(沒有加載完成)。
  3. 數字是:
    • 2個線程大約40%而不是50個(每個線程85%)。
    • 3個線程大約50%而不是75個(每個線程65%)。
    • 4個線程大約60%而不是100個(每個線程60%)。
  4. 我使用帶有16GB內存的i7 2600,但該進程的內存使用率並未接近。
  5. 我運行Windows性能監視器來尋找沒有的爭用。

您可以嘗試將程序從工作站轉移到服務器垃圾收集模式。 目前,您可以只使用一個垃圾收集線程。
這里解釋設置。
有關說明/更多詳細信息,請參閱此主題
不要指望在更改后100%的CPU負載,但是你將接近100%並增加它的速度。

並發可視化工具將在這里為您提供幫助。 您將看到每個線程何時執行,如果所有線程都沒有執行,您可以確切地看到特定線程正在等待的原因。 如果生成大量垃圾,GC可能會阻止線程導致線性縮放。 但你只能通過真正的調查找到答案。

我在使用.NET Framework v2.0時遇到了同樣的問題,然后我將項目目標框架更改為v4.0,它以100%CPU負載啟動

編輯:您只需使用即可查看每個線程的CPU使用情況

Sysinternals Process Explorer

要么

流程黑客

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM