"Magical" 英特尔 C++ 编译器:发生了什么事?
"Magical" intel c++ compiler : what happened?
我在*nix。在 looptest.cpp
中有这个简单的 c++ 代码
#include <iostream>
#include <time.h>
int main()
{
double sum = 0.0;
int n ;
std::cout << "n ?" << std::endl;
std::cin >> n ;
clock_t t_start = clock();
for (int i = 0 ; i < n ; ++i)
{
sum+= static_cast<double>(i);
}
clock_t t_end = clock();
clock_t diff = t_end - t_start;
double diffd = static_cast<double>(diff)/CLOCKS_PER_SEC;
std::cout << diffd << " seconds." << std::endl;
sum*=1.0;
return 0;
}
使用intel c++编译器(icpc (ICC) 14.0.4 20140805, 2013)编译如下:
/opt/intel/bin/icpc looptest.cpp -o looptest
当我测试它时,我得到了以下奇怪的结果:
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
10000
4e-06 seconds.
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
100000
3e-06 seconds.
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
1000000
3e-06 seconds.
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
1000000000
2e-06 seconds.
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
4294967295
3e-06 seconds.
奇怪,不是吗?这里发生了什么 ?当然,用 gnu-5.2 的 g++
而不是 icpc
编译给出了预期的结果(当 n 增加时时间增加。)
sum
无处可读,因此删除了对该变量的所有赋值。这使得 for 循环为空,因此它也被删除了。因此剩下的就是:
#include <iostream>
#include <time.h>
int main()
{
int n ;
std::cout << "n ?" << std::endl;
std::cin >> n ;
clock_t t_start = clock();
clock_t t_end = clock();
clock_t diff = t_end - t_start;
double diffd = static_cast<double>(diff)/CLOCKS_PER_SEC;
std::cout << diffd << " seconds." << std::endl;
return 0;
}
您可以有效地衡量单次调用 clock()
的速度。
查看编译后的代码,找出编译器所做的优化。 GCC "should" 能够进行相同的优化,但只有将参数 -O
(-O2
, -O3
, -Os
) 添加到调用。
我在*nix。在 looptest.cpp
#include <iostream>
#include <time.h>
int main()
{
double sum = 0.0;
int n ;
std::cout << "n ?" << std::endl;
std::cin >> n ;
clock_t t_start = clock();
for (int i = 0 ; i < n ; ++i)
{
sum+= static_cast<double>(i);
}
clock_t t_end = clock();
clock_t diff = t_end - t_start;
double diffd = static_cast<double>(diff)/CLOCKS_PER_SEC;
std::cout << diffd << " seconds." << std::endl;
sum*=1.0;
return 0;
}
使用intel c++编译器(icpc (ICC) 14.0.4 20140805, 2013)编译如下:
/opt/intel/bin/icpc looptest.cpp -o looptest
当我测试它时,我得到了以下奇怪的结果:
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
10000
4e-06 seconds.
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
100000
3e-06 seconds.
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
1000000
3e-06 seconds.
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
1000000000
2e-06 seconds.
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
4294967295
3e-06 seconds.
奇怪,不是吗?这里发生了什么 ?当然,用 gnu-5.2 的 g++
而不是 icpc
编译给出了预期的结果(当 n 增加时时间增加。)
sum
无处可读,因此删除了对该变量的所有赋值。这使得 for 循环为空,因此它也被删除了。因此剩下的就是:
#include <iostream>
#include <time.h>
int main()
{
int n ;
std::cout << "n ?" << std::endl;
std::cin >> n ;
clock_t t_start = clock();
clock_t t_end = clock();
clock_t diff = t_end - t_start;
double diffd = static_cast<double>(diff)/CLOCKS_PER_SEC;
std::cout << diffd << " seconds." << std::endl;
return 0;
}
您可以有效地衡量单次调用 clock()
的速度。
查看编译后的代码,找出编译器所做的优化。 GCC "should" 能够进行相同的优化,但只有将参数 -O
(-O2
, -O3
, -Os
) 添加到调用。