2014-08-29 72 views
0

即使我編寫可能的最快性能代碼,發佈版本是否比調試版本更快(因爲發佈版本正在優化很多)?發佈版本與調試版本性能

還是有可能編寫C++代碼(使用調試),它與發佈版本一樣快?

我,如果我的代碼太慢只是好奇,因爲我注意到一個可敬的差異,當我做性能測試。

+2

如果在分析你應該總是與優化運行啓用,因爲除了極簡單的代碼或內聯彙編,往往不同的指令將產生(或甚至在庫的情況下,不同的C++代碼將在MSVCs進行編譯,例如STL的實施)。 – 2014-08-29 20:07:48

+0

我還注意到一個不同之處,對於使用小方法調用的簡單程序(gettet/setter) - 在循環當然 - 沒有任何其他利益,即使當我使用內聯等獲得良好性能時 – jeromintus 2014-08-29 20:14:38

+0

這可能是因爲編譯器在啓用優化的情況下(例如自動向量化/自動並行化,循環展開等)處於釋放模式時通常可以(並且將會)執行各種性能增強操作,並且使用'inline'不能保證編譯器將嵌入它。 – 2014-08-29 20:16:08

回答

7

算法的一個很好的選擇肯定會在調試版本的速度有很大的區別,但調試版本絕不會那麼快。這是因爲優化器調度寄存器的方式完全不同,試圖使代碼快速運行,而調試編譯器試圖保留臨時變量的值,以便您可以從調試器中讀取它們。

因爲你很可能有比CPU寄存器了很多更多的變數,這意味着調試編譯器會發出指令以複製這些值到RAM中。在發佈版本中,如果該值不再被使用,優化器會將其丟棄。

0

一般來說,這取決於。

某些發佈版本可能與調試版本不同。

還取決於調試和發佈版本之間的配置差異。如果唯一的區別是調試版本中的符號信息,那麼它們將具有相同的性能。

在我的商店,我們正在發佈調試軟件。可執行文件無需任何符號即可進入Flash。

+0

*」還取決於調試和發佈版本之間的配置差異。「*爲什麼「也」?我會說「只有」... – 2014-08-29 21:14:07

0

如果在代碼中有數據結構驗證,它可能會使調試比發佈慢很多。另一方面,如果你的應用程序是花費大部分時間調用系統例程的類型,比如I/O,內存分配,信號量等等,那麼釋放速度不會比調試速度快得多。

在另一個方面,如果你的程序有使用大量的自我時間的函數,這些將是一個發佈版本更快。

+0

爲什麼在發佈版本中有很多自我時間的功能更快? – jeromintus 2014-08-29 22:02:04

+0

@Sleicreider:代碼只從程序計數器實際存在的時間分數的優化中受益,這就是自我時間。如果99%的程序計數器處於內存分配,數學庫或等待I/O的時間,那麼即使優化器無限地加速代碼,它的整體存儲效率也不會超過1%。 – 2014-08-30 00:06:04

+0

在我的情況下,我使用了簡單的方法調用,如: 'string&GetText(){return text:}' – jeromintus 2014-08-30 10:42:53

相關問題