在編譯C語言代碼時,Clang跟gcc編譯器哪一個編譯出來的程序運行更快?特別是在浮點運算方面。

大家都在說Clang運行更快,但是編譯出來的程序哪個運行更快呢?尤其是在浮點運算方面。

======

有人說這樣比較沒多大意義,很多時候對很多人看來很小的時間節省,當面臨大型計算的時候,也可以節省很多時間。有答案提到了Intel的mkl庫,作為一個窮屌絲買不起intel的那套東西,只能用GSL庫。但是研究工作又需要追求速度,但總不能要求一個研究人員即懂數學問題又懂底層的優化吧。。我看到有人說用intel的編譯器可以快40%才想起這個問題,因為40%可能就是幾天甚至一個星期的時間。


目前編譯器的SIMD優化還沒有靠譜到讓我們特別放心的地步,還是自己寫SSE指令吧。順便說一下,VC++現在有一個C++的小擴展叫C++/AMP,可以把程序的一部分標記為在GPU運行,數據交換特別方便,比起opencl、cuda甚至是自家的direct compute都用起來爽多了。我覺得既然你說到浮點運算,那你可能需要這個。


實際測試並查看了反彙編

較新版本的gcc和clang編譯出來的指令幾乎是一樣的,所以不存在那個更快的問題。

gcc 6連編譯錯誤的提示都越來越像clang了,也就是說這兩個編譯器正在同質化。

要極端優化還是靠自己手寫SIMD彙編吧


個人認為這樣比較沒什麼太大意義。

對於性能要求比較嚴格的程序,我認為應該主要靠手動優化,而不是等著換個編譯器期待性能有提升這種聽天由命的做法。

比如Intel的mkl庫,完全是基於不同的指令集做了多套代碼,這樣才能達到極致的性能。而且大部分編譯器並不會使用比較新的指令集,除非顯式指定。你自己寫SIMD指令要比它生成的好,至少你清楚數據的整個計算流程,而編譯器只能去猜你的意思。

對於性能要求不那麼嚴格的程序,個人感覺也沒必要追求這個。選個順手的編譯器就好了。


同樣的代碼,比較編譯器才有意義。

不同的庫可能就有演算法級的區別。而且還有針對特別的輸入,有特別的優化。好像Intel就要專門的memcpy組,專門做memcpy這個函數。

一般來說,指令級的優化還是留到最後,演算法上不能提高了,才在指令上想辦法。對於SIMD,如果對編譯器的自動vectorization不滿意,可以考慮compiler的builtin intrinsics。實在實在不行了,再考慮手寫彙編。


推薦閱讀:

在Mac上編C/C++不用Xcode而藉助terminal調用gcc真的好嗎?
LLVM/Clang 在工程領域應用如何?
clang編譯器的錯誤提示的精準程度是如何做到的?
如何看待微軟開源的 C 語言版本——Checked C?

TAG:C編程語言 | GCC | 編譯器 | Clang | LLVM |