前两天看到一篇文章提到了用MagicNumber来做神奇的导数开方运算,于是我打算试一试测试系统的函数的性能
#include "stdafx.h" #include <math.h> #include <time.h> #define MAX_SIZE 100000000 double data[MAX_SIZE]; void test() { for (int i = 0; i < MAX_SIZE; i++) { data[i] = sqrt(i); } } int main() { int t1 = clock(); test(); printf("%ld ms", clock() - t1); getchar(); for (int i = 0; i < MAX_SIZE - 1; i++) { data[i] = data[i + 1]; } return 0; }
以上这段简短的程序就是我写的来测试性能的代码。注意:后面的的重写这个数组是为了防止编译器优化把计算的循环给优化掉。
测试机器是我的笔记本
- CPU:Intel i73517U @2.7GHz
- 内存:16G DDR3L 1600Mhz
性能测试的时候为了准确使用了Intel的性能调试工具,没有使用程序输出的数值。编译全部是windows平台,gcc使用mingw环境。都是debug模式开O2优化,x64代码。
VS 2015:557.943ms
CLang 3.7:605.040ms
icc 16.0:762.681ms
gcc 5.2.0:1269ms
附加测试:Linux上的性能测试。有朋友说我的测试都是Windows平台,Linux平台下面g++可能性能会更好,于是我有做了另一个测试
测试机器是我的一台服务器
- CPU Xeon E5-2603 x2 @ 1.80 GHz
- 内存:16G
由于服务器上没有Intel的性能调试工具的授权,所以使用系统函数来测试时间。系统是Ubuntu
CLang 3.4 :1020.149ms
gcc 4.8.4:1355.673ms
所以可以看出来在Linux系统下面gcc的性能有所提升,但是仍然比不了clang