Форум: "Основная";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];
ВнизСкорость выполнения операций Найти похожие ветки
← →
мух (2006-01-14 11:25) [0]Почему скорость операций над целыми числами меньше скорости над числами с плавающей точкой?
Выполняю циклы вида
for i:=1 to n do ;
for i:=1 to n do a:=5*10; // a:integer
for i:=1 to n do b:=5.5*10.5; // b:extended
Быстрее всех выполняется цикл с плавающей точкой (!), затем пустой и потом - цикл над целыми (!).
Тестировал на разных машинах (но только с процессорами celeron). Если кто знает в чем тут фокус - поделитесь знаниями :)
← →
KSergey © (2006-01-14 11:36) [1]Приведите использованную методику тестирования, плиз
← →
begin...end © (2006-01-14 11:37) [2]Умножения в цикле здесь не происходит -- константы 5*10 и 5.5*10.5 вычисляются ещё на этапе компиляции, поэтому о тестировании скорости умножения здесь говорить не приходится.
Если значения переменных a и b используются где-нибудь после циклов, то в самих циклах будет только помещение нужных заранее вычисленных значений в переменные. Чтобы поместить некоторое значение в переменную Extended, требуется больше операций, чем для Integer, поэтому в результаты тестирования верится слабо. Если же a и b после циклов не используются, то при включённой оптимизации все три цикла будут совершенно одинаковыми.
Приведите код, который использовался для оценки времени выполнения.
← →
мух (2006-01-14 11:49) [3]Прошу прощение за неточность, тела циклов выглядили в оригинале так:
begin
aE:=5.5;
bE:=10.5;
cE:=aE*bE;
cE:=aE*bE;
cE:=aE*bE;
cE:=aE*bE;
cE:=aE*bE;
end;
тут aE, bE, cE - имеют тип extended
для других типов использовал аналогичные вырожения.
Количество итераций - 3 раза по 2 млрд. - брал среднее время выполнения цикла (2 млрд итераций), получал то, что описал выше.
Текст программы с собой не имеется :|
← →
begin...end © (2006-01-14 12:10) [4]> мух (14.01.06 11:49) [3]
Да, если код выглядел так, то умножение (и целочисленное, и вещественное) производилось. Но в результаты тогда тем более не верится. Хотя бы по причине, указанной в [2] -- на заполнение переменных aE и bE потребуется гораздо больше времени, чем на aI и bI.
Вот код, дающий грубую оценку скорости:procedure TForm1.Button1Click(Sender: TObject);
const
N = 100000000; // 100 млн
var
I: Integer;
aI, bI, cI: Integer;
aE, bE, cE: Extended;
T1, T2, T3: Cardinal;
begin
T1 := GetTickCount;
for I := 1 to N do;
T1 := GetTickCount - T1;
T2 := GetTickCount;
for I := 1 to N do
begin
aI := 5;
bI := 10;
cI := aI * bI;
end;
T2 := GetTickCount - T2;
T3 := GetTickCount;
for I := 1 to N do
begin
aE := 5.5;
bE := 10.5;
cE := aE * bE;
end;
T3 := GetTickCount - T3;
ShowMessage(Format("Пустой: %d Integer: %d Extended: %d", [T1, T2, T3]));
Caption := FloatToStr(cI + cE)
end
У меня (на Pentium 3) результаты таковы:
Пустой: 430 Integer: 741 Extended: 7371
> cE:=aE*bE;
> cE:=aE*bE;
> cE:=aE*bE;
> cE:=aE*bE;
> cE:=aE*bE;
Достаточно оставить одну из этих строк, т.к. остальные будут удалены оптимизатором.
> Текст программы с собой не имеется
Тогда и обсуждать, в общем-то, нечего.
← →
мух (2006-01-14 12:17) [5]текст программы такой-же как тот, что указан Вами за тем лишь исключением, что время брал не функцией GetTickCount, а Time.
Ради интереса попробую Вашу функцию...
← →
мух (2006-01-14 12:55) [6]Да, такой вариант показывает более правдоподобные цифры. Хотя в чем юмор так и не понятно.
← →
Anatoly Podgoretsky © (2006-01-14 16:50) [7]Юмор определяется просмотром CPU кода
← →
мух (2006-01-16 08:10) [8]Юмор обнаружен в работе этого самого ОПТИМИЗАТОРА. Теперьче всё прояснилось :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.039 c