Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.041 c
2-1137926305
Compton's G
2006-01-22 13:38
2006.02.12
Битмап


15-1138028265
Харько
2006-01-23 17:57
2006.02.12
Алгоритм выделения части из целого


2-1138282879
zhechkov
2006-01-26 16:41
2006.02.12
Список файлов


4-1133293119
Vadimka
2005-11-29 22:38
2006.02.12
Как подвинуть рабочий стол и ярлыки на нем?


15-1137603867
DSKalugin
2006-01-18 20:04
2006.02.12
Service Pack 1 и 2 для Delphi 6





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский