clang與icc:標準庫排序效能對比

演算法時空發表於2018-12-10

為了測試icc和clang的sort函式效能,我們還是搬出10億規模的隨機數排序:

github.com/xiexiexx/Pl…

icc篇

本來直接使用即可:

icpc billionsort.cpp
./a.out
複製程式碼

可是執行之後會出現:

0.0535384 minutes
Segmentation fault: 11
複製程式碼

也就是真正開始使用向量的時候出錯,事實上它返回的向量長度是18446744073635809792而不是我們輸入的1000000000,實際上這個結果是-1000000000轉化成無符號數的結果。這是一個bug,而且是在O2級別以上優化才會出現的問題,所以只能使用:

icpc -O1 billionsort.cpp
./a.out
複製程式碼

倒是能執行出結果,但是這樣沒法比較clang的效能。

所以,我們考慮將billionsort.cpp中的1000000000改成2000000000,也就是20億個數的排序,重新命名為x.cpp,再使用高階優化:

icpc -O3 x.cpp
./a.out
複製程式碼

這次倒是不出錯了,隨便拿一次執行結果看看:

0.108003 minutes
0.309677 minutes
3.27189 minutes
複製程式碼

當然,由於是隨機輸入,我們需要多次重複執行程式取平均,這個實驗留給大家自己做吧。

clang篇

使用高階優化編譯之後順利執行:

clang++ -O3 x.cpp
./a.out
複製程式碼

隨便拿一次執行結果出來:

0.10993 minutes
0.229284 minutes
3.21184 minutes
複製程式碼

優化得很不錯。

總結

clang穩定,而且效能優化也很好,但是目前對並行演算法支援不太好,有待加強。icc的確要加強穩定性了,而且優化效能也沒能讓人滿意,目前對優勢在於對並行排序的支援。

相關文章