Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Вниз

Ночные странности   Найти похожие ветки 

 
bems ©   (2014-12-03 05:50) [0]

есть такая строчка
Result := Result shl 4 + Result shl 3 + Result shl 1; // * 26

вопрос в том, а не лучше было бы просто умножить?


 
Pavia ©   (2014-12-03 06:14) [1]

Умножение занимать 5-7 тактов.
Данный код 3 такта.


 
junglecat ©   (2014-12-03 08:51) [2]

(Result shl 4) or (Result shl 3) or (Result shl 1)?


 
Sha ©   (2014-12-03 09:33) [3]

> bems ©   (03.12.14 05:50)  
Почему бы не проверить? Скорее всего, умножение будет быстрее.

> junglecat ©   (03.12.14 08:51) [2]
Результат будет отличаться в общем случае.


 
junglecat ©   (2014-12-03 09:42) [4]

> будет отличаться в общем случае

ну да. мне почему-то всегда инстинктивно хочется or вставить, если я вижу shl )


 
MBo ©   (2014-12-03 09:45) [5]

>а не лучше было бы просто умножить?
Эта строка влияет на общее время выполнения программы?


 
jack128 ©   (2014-12-03 09:51) [6]


> вопрос в том, а не лучше было бы просто умножить?

Лучше. По крайней мере пока нету результатов замеров производительности.


 
junglecat ©   (2014-12-03 10:04) [7]

> Умножение занимать 5-7 тактов

так много? а не те же 3 такта? по крайней мере, на каком-нибудь core duo


 
Rouse_ ©   (2014-12-03 12:29) [8]


> bems ©   (03.12.14 05:50) 
> есть такая строчка
> Result := Result shl 4 + Result shl 3 + Result shl 1; //
> * 26
>
> вопрос в том, а не лучше было бы просто умножить?

Лучше просто умножить, т.к. этот код выполняется медленнее, чем умножение.


 
bems ©   (2014-12-03 14:32) [9]


> (Result shl 4) or (Result shl 3) or (Result shl 1)?

нет, речь о сложении


> Почему бы не проверить? Скорее всего, умножение будет быстрее.

тогда мне не о чем было бы создать топик


> Эта строка влияет на общее время выполнения программы?

я не видел всей программы


 
MBo ©   (2014-12-03 15:55) [10]

И всё-таки вопрос не очень понятен.

Почему так кто-то написал?
Может, экономил на спичках в пору, когда умножение могло быть медленнее двух сложений и трех побитовых операций.


 
Dimka Maslov ©   (2014-12-03 17:14) [11]

У меня получается, что умножение таки на 10% медленнее.
Intel G3250 3.2 ГГц 32 битный код в Delphi2009

Но если взять 64 битный код MSVC++2013 то умножение происходит на 2% быстрее.


 
Sha ©   (2014-12-03 17:29) [12]

> Dimka Maslov ©   (03.12.14 17:14) [11]
> У меня получается, что умножение таки на 10% медленнее.

но это ж не один оператор в функции,
вся функция быстрее будет за счет меньшего потребного железа и спариваемости


 
Rouse_ ©   (2014-12-03 18:28) [13]


> Dimka Maslov ©   (03.12.14 17:14) [11]
> У меня получается, что умножение таки на 10% медленнее.
> Intel G3250 3.2 ГГц 32 битный код в Delphi2009
>
> Но если взять 64 битный код MSVC++2013 то умножение происходит
> на 2% быстрее.

Эт смотря как мерять:

function T1(V: Integer): Integer;
begin
 Result := V shl 4 + V shl 3 + V shl 1; // * 26
end;

function T2(V: Integer): Integer;
begin
 Result := V * 26;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 I: Integer;
 S: dword;
begin
 S := GetTickCount;
 for I := 0 to $7FFFFFF do
   T1(I);
 Memo1.Lines.Add(IntToStr(GetTickCount - S));
 S := GetTickCount;
 for I := 0 to $7FFFFFF do
   T2(I);
 Memo1.Lines.Add(IntToStr(GetTickCount - S));
end;


 
Dimka Maslov ©   (2014-12-03 23:20) [14]


> Эт смотря как мерять:


Тут ещё от системы зависит. Помнится мне, я тестировал быстродействие "CYRIX 166+" и Intel Pentium 166. На каких-то задачах цырикс показывал большее быстродействие, а на других - серьёзно проигрывал.


 
Rouse_ ©   (2014-12-04 00:27) [15]

Тут другая ситуевина, очень сложно выиграть у imul по тактам, просадка будет по любому, за исключением одного очень специфического случая, и то не всегда


 
Inovet ©   (2014-12-04 03:43) [16]

> [15] Rouse_ ©   (04.12.14 00:27)
> за исключением одного очень специфического случая

8086?


 
Pavia ©   (2014-12-04 12:23) [17]

i5-4570
c ключевым словом Const
188 203
188 187
188 187
188 187
188 187
188 187
187 204
187 188
188 203
203 188
Частота дескритизации счётчика и переключение задач делают интервал 10-1000  мс недостоверным. Поэтому увеличил время замера.

Без ключевого слова Const
1860 1562
1844 1562
1844 1563
Тест не корректный так как D7 генерирует код рассчитанный на параллельную работу. Т.е значение V - в выражение на разных тактах может меняться. Откуда имеем лишние обращение к кэшу.

c ключевым словом Const
1531 1531
1516 1531
1531 1516
1516 1515
1516 1515
1516 1515
1531 1515

Собственно результат говорит о конвейерной обработке и умножение разных команд идут в параллели.

> Умножение занимать 5-7 тактов.
> Данный код 3 такта.

Давно не обновлял таблицы. На 4 поколение i7 умножение уже 4 такта. А в коде со сдвигами я не учёл еще один такт. Итого 4 против 4.

Но умножение занимает 1 вычислительный блок(АЛУ) и то не полностью, а вот код со сдвигами несколько.
Так что если надо и другую арифметику, то лучше imul.


> > [15] Rouse_ ©   (04.12.14 00:27)> за исключением одного
> очень специфического случая8086?

Думаю Розыч о LEA который позволяет умножать на 3, 5 и 9 за 1 такт.


 
Rouse_ ©   (2014-12-04 13:01) [18]


> Думаю Розыч о LEA который позволяет умножать на 3, 5 и 9
> за 1 такт.

Угу:

function T3(V: Integer): Integer;
asm
 mov edx, eax
 shl edx, 4
 lea edx, [edx + eax * 8]
 lea eax, [edx + eax * 2]
end;


 
Sha ©   (2014-12-04 13:55) [19]


function T4(V: Integer): Integer;
asm  
 lea edx, [eax + eax * 8]  
 lea edx, [edx + edx * 2]
 sub edx, eax
 mov eax, edx  
end;


 
Rouse_ ©   (2014-12-04 14:25) [20]


> Sha ©   (04.12.14 13:55) [19]

Тогда уж:
function T5(V: Integer): Integer;
asm
lea edx, [eax * 8]
lea edx, [edx + edx * 2]
lea eax, [edx + eax * 2]
end;

;)


 
Inovet ©   (2014-12-04 16:12) [21]

Так в lea же фиксированные значения, сдвигом по сути умножается. Или уже поменялось всё?


 
Rouse_ ©   (2014-12-04 16:17) [22]

Сдвигом, но за один такт, т.е. function T5 исполняется всего за 3 такта.


 
Sha ©   (2014-12-04 16:53) [23]

> Rouse_ ©   (04.12.14 14:25) [20]

думаю, совпадет


 
Rouse_ ©   (2014-12-04 17:53) [24]

Конечно совпадет, у тебя (V * 27) - V, у меня (V * 24 + V * 2) в итоге что и хотели, V * 26 :)


 
Sha ©   (2014-12-04 18:40) [25]

> Rouse_ ©   (04.12.14 17:53) [24]

я о тактах и времени, а не о результате )


 
Rouse_ ©   (2014-12-04 19:04) [26]

А..., по тактам у меня шустрее, но время будет идентично по всех трех функциях T3-T5 на финализации :)


 
имя   (2014-12-09 19:11) [27]

Удалено модератором



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.077 c
15-1418231693
Rouse_
2014-12-10 20:14
2015.09.10
Троичная логика и математика (триты, трайты и прочая нечисть :)


15-1417463414
Kerk
2014-12-01 22:50
2015.09.10
Java => Delphi


15-1413374633
xayam
2014-10-15 16:03
2015.09.10
[Гравитация] Может такое быть?


2-1392732185
Alex_C
2014-02-18 18:03
2015.09.10
Событие OnPaint для компонентов


15-1413837002
Юрий
2014-10-21 00:30
2015.09.10
С днем рождения ! 21 октября 2014 вторник





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