我正在考虑以下 C++ 程序:
#include <iostream>
#include <limits>
int main(int argc, char **argv) {
unsigned int sum = 0;
for (unsigned int i = 1; i < std::numeric_limits<unsigned int>::max(); ++i) {
double f = static_cast<double>(i);
unsigned int t = static_cast<unsigned int>(f);
sum += (t % 2);
}
std::cout << sum << std::endl;
return 0;
}
我使用 gcc / g++ 编译器, g++ -v 给出 gcc 版本 4.7.2 20130108 [gcc-4_7-branch revision 195012] (SUSE Linux)。我正在运行 openSUSE 12.3 (x86_64) 并拥有 Intel(R) Core(TM) i7-3520M CPU。
跑步
g++ -O3 test.C -o test_64_opt
g++ -O0 test.C -o test_64_no_opt
g++ -m32 -O3 test.C -o test_32_opt
g++ -m32 -O0 test.C -o test_32_no_opt
time ./test_64_opt
time ./test_64_no_opt
time ./test_32_opt
time ./test_32_no_opt
产量
2147483647
real 0m4.920s
user 0m4.904s
sys 0m0.001s
2147483647
real 0m16.918s
user 0m16.851s
sys 0m0.019s
2147483647
real 0m37.422s
user 0m37.308s
sys 0m0.000s
2147483647
real 0m57.973s
user 0m57.790s
sys 0m0.011s
使用 float 而不是 double,优化的 64 位变体甚至在 2.4 秒内完成,而其他运行时间大致相同。但是,使用 float 我会根据优化得到不同的输出,这可能是由于处理器内部精度更高。
我知道 64 位的数学运算速度可能更快,但我们这里有 7 倍(浮点数接近 15 倍)。
我将不胜感激这些运行时间差异的解释。