clang与icc:标准库排序性能对比

837 阅读1分钟

为了测试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的确要加强稳定性了,而且优化性能也没能让人满意,目前对优势在于对并行排序的支持。