为了测试icc和clang的sort
函数性能,我们还是搬出10亿规模的随机数排序:
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的确要加强稳定性了,而且优化性能也没能让人满意,目前对优势在于对并行排序的支持。