Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2017, 09:39   #1
Дmmm
Пользователь
 
Регистрация: 26.02.2013
Сообщений: 66
По умолчанию Как быстрее будет работать?

Допустим, надо
if B then
x:=x*2;

Аналогичный эффект даст
x:=x*(1+Ord(B));

Но что быстрее?
Дmmm вне форума Ответить с цитированием
Старый 14.02.2017, 09:46   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

Обычно важнее "как читаемее", а не "как быстрее".
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 14.02.2017, 11:09   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Дmmm Посмотреть сообщение
Но что быстрее?
на мой взгляд - предпочтительнее первый вариант - проверить логическую переменную явно быстрее, чем выполнять сложение, умножение и запись результата в переменную.
да и выглядит этот код намного наглядней, проще и понятней.

но я полностью согласен с Alex11223 - в любом случае речь идёт о выигрыше нескольких тактов процессора, миллиардные доли секунды, вряд ли это скажется на скорости работы вашего приложения.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.02.2017, 11:24   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Там еще зависимость от частоты появления True в B. Если сплошняком True, то 2-ой вариант и побыстрей возможно будет. Да, и скажется в циклах на сотни тысяч итераций ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.02.2017, 11:45   #5
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Код:
procedure TForm1.Button2Click(Sender: TObject);
var i,n:Integer;
   t0:tDateTime;
   x:Extended;
   B:Boolean;
begin
 n:=StrToIntDef(Edit3.Text,1);
 t0:=Now;
 B:=True;
 x:=2/MaxExtended;
 for i:=1 to n do
  begin
   B:=not B; 
   if B then x:=x*2;
   if x>MaxExtended/4 then x:=2/MaxExtended;
  end;
 Edit1.Text:='1 -> '+FloatToStr(86400*(Now-t0));
 t0:=Now;
 B:=True;
 x:=2/MaxExtended;
 for i:=1 to n do
  begin
   B:=not B;
   x:=x*(1+Ord(B));
   if x>MaxExtended/4 then x:=2/MaxExtended;
  end;
 Edit2.Text:='2 -> '+FloatToStr(86400*(Now-t0));
end;
Изображения
Тип файла: png t1.PNG (11.4 Кб, 133 просмотров)
type_Oleg вне форума Ответить с цитированием
Старый 14.02.2017, 21:58   #6
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от Дmmm Посмотреть сообщение
Допустим, надо
if B then
x:=x*2;

Аналогичный эффект даст
x:=x*(1+Ord(B));
Код:
var
  X: Integer;
  B: Boolean;
begin
  X := 100;
  X := X * 2;
  ShowMessage(IntToStr(X));
  B := True;
  X := 100;
  X := X * (1 + Ord(B));
  ShowMessage(IntToStr(X));
end;
Вот во что это превращает компилятор Delphi 6:
Код:
// -- Line #613 --
  16: »d...  |BB 64 00 00 00      | MOV EBX{@X},$00000064
// -- Line #614 --
  1B: ‹Г     |8B C3               | MOV EAX,EBX{@X}
  1D: .А     |03 C0               | ADD EAX,EAX
  1F: ‹Ш     |8B D8               | MOV EBX{@X},EAX
// -- Line #615 --
  21: ЌUь    |8D 55 FC            | LEA EDX,DWORD PTR [EBP-4]
  24: ‹Г     |8B C3               | MOV EAX,EBX{@X}
  26: и....  |E8(00 00 00 00      | CALL IntToStr{#$88}
  2B: ‹Eь    |8B 45 FC            | MOV EAX,DWORD PTR [EBP-4]
  2E: и....  |E8(00 00 00 00      | CALL ShowMessage{#$1C}
// -- Line #616 --
  33: °.     |B0 01               | MOV AL{@B},$01
// -- Line #617 --
  35: »d...  |BB 64 00 00 00      | MOV EBX{@X},$00000064
// -- Line #618 --
  3A: ѓа    |83 E0 7F            | AND EAX{@B},127
  3D: @      |40                  | INC EAX{@B}
  3E: чл     |F7 EB               | IMUL EBX{@X}
  40: ‹Ш     |8B D8               | MOV EBX{@X},EAX{@B}
// -- Line #619 --
  42: ЌUш    |8D 55 F8            | LEA EDX,DWORD PTR [EBP-8]
  45: ‹Г     |8B C3               | MOV EAX,EBX{@X}
  47: и....  |E8(00 00 00 00      | CALL IntToStr{#$88}
  4C: ‹Eш    |8B 45 F8            | MOV EAX,DWORD PTR [EBP-8]
  4F: и....  |E8(00 00 00 00      | CALL ShowMessage{#$1C}
Ключевые моменты выделил подчеркиванием, а то жирное ни фига не видно с ClearType. В теории умножение медленней сложения, поэтому первая реализация будет работать быстрее. На практике же на Intel Core, i3-i7 исполнение сильно спекулятивное, поэтому часто занимает только один такт, даже умножение (на момент, когда понадобился результат, умножение уже выполнено упреждающим выполнением).

Но лучше, конечно, писать проще и давать компилятору возможность применять свои нехитрые оптимизации.
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вставить php в xslt и будет ли он работать dvornik1 PHP 10 01.04.2015 10:01
как будет работать _ILYA_ Общие вопросы C/C++ 3 29.10.2010 10:50
Что будет работать быстрее?? Pahan Общие вопросы C/C++ 9 20.12.2009 21:24
Как заставить TTimer работать быстрее? Вадим Буренков Общие вопросы Delphi 5 21.07.2009 09:08
Seagate - ST3320620AS 320Gb. работает в режиме SATA1 и может работать в двое быстрее, как настроить? MacTiger Компьютерное железо 1 21.04.2009 04:57