Главная страница
    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.039 c
2-1138099309
SergeyZ
2006-01-24 13:41
2006.02.12
Обновление пути в ярлыке.


1-1137241222
Gear
2006-01-14 15:20
2006.02.12
ListBox и прокрутка вниз.


2-1138104329
K_Lock
2006-01-24 15:05
2006.02.12
Таблица и индексы


15-1138035799
MAXH0
2006-01-23 20:03
2006.02.12
Помогите найти компоненту


3-1134573689
CarlCorey
2005-12-14 18:21
2006.02.12
пороблемы с MySQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский