我一直在努力,我想以前一直使用編譯G ++ 4.8.1與參數什麼已知的性能差使用-std =當發現GNU ++ 11
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native -std=gnu++11
我遺傳算法沒有使用許多的C++ 11的特徵,並且具有合理的資料配置系統,所以我替換的代碼字面上3-4線,把它編譯不-std = GNU ++ 11
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native
當我再次運行我的分析器,我發現幾乎在任何地方我都能看到〜5%的性能提升,除了我的分類函數whi現在需要約兩倍的時間。 (這是一個重載運算符<的對象)
我的問題是:
兩個版本之間已知有什麼性能上的差異,而它預計C++ 11將是新的編譯器速度更快?
我也期待着我正在使用的事實-Ofast正在扮演一個角色,我對我的假設是否正確?
UPDATE:
至於建議中的意見,我進行的測試中再次使用和不使用-march =本地
// Fast sort, slightly slower in other tests
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native -std=gnu++11
// Fast sort, slower in other tests
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -std=gnu++11
// Slow sort, slower in other tests
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse
// Slow sort, fastest in other tests
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native
的結論似乎是相同的使用-std = GNU ++ 11幾乎在其他任何地方都會受到輕微的懲罰,加速排序。 -march =本地加速程序,無論何時使用。
鑑於這種排序只在每一代中被調用一次,我將利用-std = gnu ++ 11編譯速度,但我仍然對造成這些結果的原因非常感興趣。我使用的是// STD
::從排序的#include
至於性能改進:在標準庫容器和算法中移動語義。然而,看到排序功能中涉及的代碼會很好,2倍速放慢是可疑的。順便說一句:'-std = gnu ++ 11'也啓用GNU擴展;你可能需要'-std = C++ 11',而不是。 – Ali
可能相關:-Ofast支持根據C++標準無效的優化。 –
@ R.MartinhoFernandes是的,但它在兩種情況下都使用,所以區別來自C++ 11功能或某些GNU擴展。然而,沒有看到實際的代碼,我們不知道爲什麼排序慢兩倍。 – Ali