次の 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++ コンパイラを使用しています。私は 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
double の代わりに float を使用すると、最適化された 64 ビット バリアントは 2.4 秒で終了しますが、他の実行時間はほぼ同じままです。ただし、 float を使用すると、おそらくプロセッサ内部の精度が高いため、最適化に応じて異なる出力が得られます。
64ビットの方が計算が速いかもしれないことは知っていますが、ここでは7倍(浮動小数点数ではほぼ15倍)です。
これらの実行時間の不一致について説明をいただければ幸いです。