2013-05-18 47 views
-5

我有使用++運行3秒,在微軟的編譯器運行在30秒,我不明白克以下代碼...爲什麼在g ++中編譯的代碼比在微軟編譯器中如此明顯地緊密呢?

struct constraint{ 
    int bitline; 
    int result; 
}; 

// this vector is filled with about 1 milion items 
vector<constraint> constraints; 

for (int a = 0; a < constraints.size(); ++a) 
{ 
    if (a% 100 == 0) cout << a << " "<<endl; 
    for (int b = a; b < constraints.size(); ++b) 
    { 
     int anded = constraints[a].bitline & constraints[b].bitline; 
     int ored = constraints[a].bitline | constraints[b].bitline; 

     // a subset of b 
     if (anded == constraints[a].bitline && constraints[a].result >= constraints[b].result) 
     { 
      // delete a 
      constraints[a].bitline = 0; 
     } 
     if (anded == constraints[b].bitline && constraints[b].result >= constraints[a].result) 
     { 
      constraints[b].bitline = 0; 
     } 

    } 
} 

編輯:我不使用optimalization標誌,withing。在windows xp 32位上運行...嘗試它沒有「調試線路」 - 沒有重大變化。

+1

GCC可能並不總是比MSVC快10倍。 –

+0

你能發佈完整的代碼嗎? –

+0

區別可能是使用的優化,或者出於某種原因,cout在msvc中可能會很慢。你可以發佈你的命令行,也可以在沒有'cout << ...'行的情況下重試嗎? –

回答

6

首先號,而MSVC++確實有其缺陷,其產生的代碼的性能通常不被認爲是壞的。

二,使用「都是編譯器作家braindead」測試。微軟的工程師必須做出如此令人難以置信的愚蠢行爲,才能使編譯器的速度與競爭對手一樣慢,而不是爲了改進而努力? 10%甚至50%可以通過「微軟的編譯器只是生成垃圾代碼」來解釋,但是1000%?可能不會。所以你應該在別處尋找解釋。 :)

而且原因很簡單:

基準測試不測試代碼的速度有多快是由兩個編譯器生成。 當你明確地告訴編譯器「不,它很好,花時間,我不在乎可執行文件的速度有多慢,我只是希望它被禁用時,你正在測試哪個編譯器插入了最多的調試檢查易於調試「

當給出這些說明時,Microsoft插入比GCC更多的附加正確性檢查和運行時檢查。因此,它的可執行文件變慢了。

基準測試時,規則1是始終啓用優化

其他任何事情都像試圖測量誰是最快的跑步者而不告訴競爭對手他們應該運行。進入廚房製作三明治而不是朝着目標前進的那個人並不一定是較慢的跑步者,他只是沒有得到任何他應該跑向球門的指示。

你的代碼中最大的罪犯(但不是唯一一個)是可能是在MSVC中的調試版本中,矢量上的operator[]包含額外的範圍檢查。但儘管如此,正確的答案並不是「哦,我只是停止使用std::vector」,但是「哦,也許我應該啓用優化」,在我關心速度的情況下。

0

不,情況並非如此。海灣合作委員會的缺點之一是,在沒有優化的情況下進行編譯時,它無法像微軟的編譯器那樣進行儘可能多的調試檢查。

相關問題