共用方式為


/MP (使用多個進程建置)

選項 /MP 可以減少在命令列上編譯來源檔案的總時間。 選項 /MP 會讓編譯器建立本身的一或多個複本,每個複本都會在不同的進程中。 然後,這些實例會同時編譯來源檔案。 在某些情況下,可以大幅減少建置來源檔案的總時間。

語法

/MP[processMax]

引數

processMax
(選擇性) 編譯器可建立的處理序數目上限。

processMax 引數的範圍必須介於 1 到 65536。 否則,編譯器會發出警告訊息 D9014 、忽略 processMax 引數,並假設進程數目上限為 1。

如果您略過 processMax 引數,則編譯器會從作業系統擷取電腦上 有效的處理器 數目,並為每一個處理器建立一個處理序。

備註

編譯 /MP 程式選項可大幅縮短編譯許多檔案時的建置時間。 為了縮短建置時間,編譯器最多會建立 processMax 個本身的複本,然後使用這些複本同時編譯原始程式檔。 此選項 /MP 適用于編譯,但不適用於連結或連結時間程式碼產生。 選項預設 /MP 為關閉。

建置時間的改善取決於電腦上的處理器數目、要編譯的檔案數目、系統資源的可用性 (例如 I/O 容量) 等因素而定。 試驗 /MP 選項,以判斷建置特定專案的最佳設定。 如需協助制定決策的相關建議,請參閱 方針

不相容的選項和語言功能

此選項 /MP 與某些編譯器選項和語言功能不相容。 如果您使用與 選項不相容的編譯器選項 /MP ,編譯器會發出警告 D9030 並忽略 /MP 選項。 如果您使用不相容的語言功能,編譯器會發出錯誤 C2813 ,然後根據目前的編譯器警告層級選項結束或繼續。

注意

大部分的選項都不相容,這是因為如果允許這些選項,在同時執行編譯器時就會將編譯器的輸出一起寫入主控台或特定檔案中。 結果,輸出就會相互摻雜而且不完整。 有時候,結合選項還可能會使效能變得更差。

下表列出與 選項不相容的 /MP 編譯器選項和語言功能:

選項或語言功能 描述
#import 預處理器指示詞 將類型程式庫中的類型轉換成 C++ 類別,然後將這些類別寫入標頭檔。
/E, /EP 將預處理器輸出複製到標準輸出 ( stdout )。
/Gm 已取代。 允許累加式重建。
/showIncludes 將 Include 檔案清單寫入標準錯誤 ( stderr )。
/Yc 寫入先行編譯的標頭檔。

診斷訊息

如果您指定與 選項不相容 /MP 的選項或語言功能,您會收到診斷訊息。 下表列出編譯器的訊息和行為:

診斷訊息 描述 編譯器行為
C2813 指示 #import 詞與 選項不相容 /MP 除非另外指定 編譯器警告層級 選項,否則編譯就會結束。
D9014 processMax 引數指定了無效值。 編譯器會忽略無效值,並假設值為 1。
D9030 指定的選項與 /MP 不相容。 編譯器會 /MP 忽略 選項。

指導方針

測量效能

請使用總建置時間來測量效能。 您可以使用實體時鐘來計算建置時間,或使用軟體來計算建置開始到停止之間的時間差。 如果您的電腦有多個處理器,則以實體時鐘計算出來的時間可能比軟體時間測量更精確。

有效處理器

電腦可以有一或多個虛擬處理器,也就是 每個實體處理器的有效處理器 。 此外,每一個實體處理器都可以有一或多個核心,如果作業系統啟用核心的超執行緒,則每一個核心看起來都會有兩個虛擬處理器。

例如,如果電腦有一個實體處理器,而處理器有一個核心且停用超執行緒,則該電腦會有一個有效的處理器。 相反地,如果電腦有兩個實體處理器,每一個都有兩個核心,且所有核心都啟用超執行緒,則這部電腦就有八個有效的處理器。 也就是說,(8個有效處理器) = (2 個實體處理器) x (每個實體處理器 2 個核心) x (每個核心 2 個有效處理器,因為超執行緒)。

如果您省略 processMax 選項中的 /MP 引數,編譯器會從作業系統取得有效的處理器數目,然後為每個有效處理器建立一個進程。 不過,編譯器無法保證哪個進程在特定處理器上執行;作業系統會做出該決定。

處理序數目

編譯器會計算要用來編譯原始程式檔的處理序數目。 該值是您在命令列上指定的來源檔案數目,以及您使用 選項明確或隱含指定 /MP 的進程數目。 如果您提供 processMax 選項的 /MP 引數,可以明確設定進程數目上限。 或者,如果您略過 processMax 引數,則可以使用預設值,也就是電腦中有效處理器的數目。

例如,假設您指定下列命令列:

cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp

在此情況下,編譯器會使用五個進程,因為這是五個原始程式檔中的較少,且最多七個進程。 或者,假設您的電腦有兩個有效的處理器,而且您指定下列命令列:

cl /MP a.cpp b.cpp c.cpp

在此情況下,作業系統會報告兩個處理器,因此編譯器會在其計算中使用兩個進程。 因此,編譯器會使用兩個進程來執行組建,因為這是兩個進程和三個原始程式檔中的較少。

原始程式檔和建置順序

原始程式檔編譯的順序,可能和它們出現在命令列中的順序不同。 雖然編譯器會建立一組處理序,其中包含編譯器的複本,但是作業系統會為每一個處理序的執行時間進行排程。 選項 /MP 無法保證來源檔案會以特定順序編譯。

當處理序可用來編譯時,就會編譯原始程式檔。 如果檔案比處理序還多,可用的處理序就會編譯第一組檔案。 當處理序處理完上一個檔案,還可以接著處理剩下的其中一個檔案時,就會處理剩下的檔案。

請勿在命令列上多次指定相同的原始程式檔。 例如,如果工具根據專案中的相依性資訊自動建立 makefile ,可能會發生多個規格。 如果您未指定 /MP 選項,編譯器會循序處理檔案清單,並重新編譯每個出現的檔案。 不過,如果您指定 /MP 選項,不同的編譯器實例可能會同時編譯相同的檔案。 不同的實例可能會同時嘗試寫入相同的輸出檔案。 一個編譯器實例會取得輸出檔案的獨佔寫入權限並成功,而其他編譯器實例則失敗併發生檔案存取錯誤。

使用類型庫 ( #import

編譯器不支援搭配 參數使用 #import 指示詞 /MP 。 如果可能,請遵循下列步驟來解決這個問題:

  • 將各種原始程式檔中的所有 #import 指示詞移至一或多個檔案,然後編譯這些檔案而不 /MP 使用 選項。 結果會產生一組標頭檔。

  • 在您的其餘原始程式檔中,插入 #include 指示詞來指定產生的標頭,然後使用 選項編譯剩餘的原始程式檔 /MP

Visual Studio 專案設定

MSBuild 工具

Visual Studio 會使用 MSBuild 工具 ( msbuild.exe ) 來建置方案和專案。 /maxcpucount:numberMSBuild 工具的 (或 /m:number ) 命令列選項可以同時建置多個專案。 而且編譯 /MP 程式選項可以同時建置多個編譯單位。 如果適合您的應用程式,請使用 或 和 /MP/maxcpucount 來改善解決方案的建置時間。

您的方案建置時間有一部分取決於執行組建的處理序數目。 numberMSBuild 選項的 /maxcpucount 引數會指定要同時建置的專案數目上限。 同樣地,編譯 processMax 程式選項的 /MP 引數會指定要同時建置的編譯單位數目上限。 /maxcpucount如果選項指定 P 專案,而 /MP 選項指定 C 進程,則 P x C 進程上限 會同時執行。

決定是否使用 MSBuild 或 /MP 技術的指導方針如下:

  • 如果每個專案中有許多專案檔案很少,請使用 MSBuild 工具搭配 /maxcpucount 選項。

  • 如果每個專案中有許多檔案的專案很少,請使用 /MP 選項。

  • 如果每個專案的專案和檔案數目已平衡,請使用 MSBuild 和 /MP 。 一開始,將 /maxcpucount 選項設定為要建置的專案數目,以及 /MP 電腦上處理器數目的選項。 測量效能然後調整設定,以產生最佳結果。 重複該迴圈,直到您對總建置時間感到滿意為止。

另請參閱

#import 指導
MSBuild 命令列參考
/Zf (更快的 PDB 產生)