一種 VC release 編譯極慢的原因和解決辦法
阿新 • • 發佈:2019-01-26
問題描述:
本人使用的是 Visual C++ 2008 。一直使用正常。
最近發現專案在 release 時編譯極慢,要6~10分鐘不等,無法忍受。
在慢的時候,輸出視窗顯示“正在生成程式碼”。
原因分析:
除錯了各種編譯選項,均不奏效。
後來分析程式碼,發現問題出現在某個特定的 cpp.
這個 cpp 的獨特之處在於有一個很大的位元組陣列的常量初始化。
例如
char a[ ] = { 0x11, 0x12, 0x15 };
在我的原始碼中,這句話的特別之處在於初始化的資料特別長,有26k。
為了讓原始碼看起來方便,我把資料部分放到了一個獨立的 txt 中,並用
include 引入到 cpp中。看起來是這樣的。
在 data.txt 中
0x11, 0x10, 0x7F, 0x8A, .....
.......
0xAB, 0x3D
在 cpp 中
char a[] = {
#include "data.txt"
};
在 Debug 模式下,編譯速度正常,但在 Release 模式下就很慢。
若將 #include "data.txt" 改成一個數,則 Release 模式下的編譯速度恢復正常。
因此判斷編譯速度慢的原因可能是 Release 模式下,編譯器嘗試優化程式碼,而包含了 data.txt 的 cpp 程式碼極長,優化程式為分析程式碼而消耗大量時間。 Debug 模式之所以編譯速度正常是因為 Debug 模式沒有對程式碼進行優化。
解決方案:
鑑於以上分析,解決的辦法就是關閉優化。但是,在整個專案關閉優化會降低程式的執行效能,若能僅在涉及到 data.txt 的部分臨時關閉優化就好了。
經查, 預編譯指令 #pragma optimiz( "") off 可以達此目的。
因此,最終的解決方案就是在包含 #include "data.txt" 的函式之前加上和之後分別加上 #pragma optimiz("") off 和 on.
程式碼如下:
#pragma ("") off void f() { char a[] = { #include "data.txt" }; ....// something else. } #pragma ("") on
表示在編譯這個函式時,臨時關閉所有編譯優化選項,在這個函式後則恢復編譯優化選項。