Я рассматриваю следующие C++ программа:32 бит против 64 бита: Массивная выполнения Разница
#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 ++ компилятора с, г ++ -v дает GCC версии 4.7.2 20130108 [GCC-4_7- версия филиала 195012] (SUSE Linux). Я запускаю openSUSE 12.3 (x86_64) и имею процессор Intel (R) Core (TM) i7-3520M.
Запуск
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
Используя поплавок вместо двойного, оптимизированный 64-битный вариант даже заканчивается в 2,4 секунды, в то время как другие времена бегущие остаться примерно то же самое. Однако с float я получаю разные выходы в зависимости от оптимизации, возможно, из-за более высокой внутренней точности процессора.
Я знаю, что 64 бит может иметь более быструю математику, но мы имеем коэффициент 7 (и почти 15 с поплавками) здесь.
Я хотел бы получить объяснение этих несоответствий в работе.
Бенчмаркинг имеет смысл только тогда, когда просят компилятор оптимизировать. Я верю, что даже в '-m32'' double' составляет 8 байтов. –