32vs64
Добавлено: 26.12.2013 08:57:20
Пишу тут пособие по freepascal и обнаружил интересный факт: 32-битные приложения выполняют арифметические операции с 8-16-32-битными значениями раза в полтора быстрее, чем 64-битные. Проверял, естественно, на 64-битных процессорах, а именно: Intel(R) Core(TM) i5-2520M, Intel(R) Xeon(R) CPU E5620 @ 2.40GHz, Dual-Core AMD Opteron(tm) Processor 8216, Dual-Core AMD Opteron(tm) Processor 2218. Использованные оси - WinXP 32bit, Win7 64bit, AltLinux p7 32bit, AltLinux p7 64bit. Цель была показать, что применять типы qword и int64 в 32-битных системах крайне неэффективно. Цель была достигнута, но побочно обнаружился собственно сабж.
Программа вида:
После компиляции в 64 бита и запуска получаем примерно следующее:
3620 мс: 32-битная арифметика для 64-разрядной ОС
3634 мс: 64-битная арифметика для 64-разрядной ОС
После компиляции в 32 бита и запуска получаем более интересный результат:
2296 мс: 32-битная арифметика для 32-разрядной ОС
7932 мс: 64-битная арифметика для 32-разрядной ОС
Результаты от запуска к запуску колеблются в пределах 5%, так-что на общую картину это не влияет.
Переписал на чистом Си, заменив longint на long, int64 на long long и получил для первой строки аналогичные результаты. Вторая строка, кстати, показала, что Си с 64-битными значениями работает одинаково быстро, что в 64-битных, что 32-битных системах, но это к делу не относится.
Итак, первая строка результата просто кричит: "Пользуйтесь 32-битными приложениями в 64-битных системах и будет ВАМ ЩАСТЬЕ!"
Где я не прав?
Программа вида:
- Код: Выделить всё
{$mode objfpc}
uses sysutils,dateutils;
const MAX=200000000;
{$IFDEF CPU64} BITS=64; {$ENDIF}
{$IFDEF CPU32} BITS=32; {$ENDIF}
{$IFDEF CPU16} BITS=16; {$ENDIF}
var
i32,MulDiv32:longint;
i64,MulDiv64:int64;
dt:tdatetime;
begin
dt:=now();
i32:=1; MulDiv32:=10;
while i32<MAX do i32:=(((i32+2)*MulDiv32) div MulDiv32)-1;
writeln(millisecondsbetween(now(),dt),' мс: 32-битная арифметика для ',BITS,'-разрядной ОС');
dt:=now();
i64:=1; MulDiv64:=10;
while i64<MAX do i64:=(((i64+2)*MulDiv64) div MulDiv64)-1;
writeln(millisecondsbetween(now(),dt),' мс: 64-битная арифметика для ',BITS,'-разрядной ОС');
end.
После компиляции в 64 бита и запуска получаем примерно следующее:
3620 мс: 32-битная арифметика для 64-разрядной ОС
3634 мс: 64-битная арифметика для 64-разрядной ОС
После компиляции в 32 бита и запуска получаем более интересный результат:
2296 мс: 32-битная арифметика для 32-разрядной ОС
7932 мс: 64-битная арифметика для 32-разрядной ОС
Результаты от запуска к запуску колеблются в пределах 5%, так-что на общую картину это не влияет.
Переписал на чистом Си, заменив longint на long, int64 на long long и получил для первой строки аналогичные результаты. Вторая строка, кстати, показала, что Си с 64-битными значениями работает одинаково быстро, что в 64-битных, что 32-битных системах, но это к делу не относится.
Итак, первая строка результата просто кричит: "Пользуйтесь 32-битными приложениями в 64-битных системах и будет ВАМ ЩАСТЬЕ!"
Где я не прав?