Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Скорость выполнения операций   Найти похожие ветки 

 
мух   (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.057 c
2-1138273981
CyMKuH
2006-01-26 14:13
2006.02.12
Как "вырвать" иконку из DLL и сохранить в "*.ico"


9-1113560515
Антон К.
2005-04-15 14:21
2006.02.12
Требуется музыкант/композитор...


15-1137696182
yuril
2006-01-19 21:43
2006.02.12
Требуется программист


15-1136963744
VID
2006-01-11 10:15
2006.02.12
Медленно работает USB 2.0 на Windows XP SP2


15-1137921992
DillerXX
2006-01-22 12:26
2006.02.12
Глазные капли