Программа вида:
- Код: Выделить всё
{$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-битных системах и будет ВАМ ЩАСТЬЕ!"
Где я не прав?