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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2014, 00:52   #21
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

На скриншоте ассемблер, а не процессор. А то что в Caption cpu написано, ну так на заборе тоже пишут. Что -то ни кто не повторяет. Речь о ассемблере? Не вопрос. Я в ассемблере не очень разбираюсь, но что я точно знаю, что код выполняется построчно. В первом блоке я вижу шесть строк кода, во втором пять. Какой быстрее выполнится? Поразмышляй на досуге.
doktor255 вне форума Ответить с цитированием
Старый 15.05.2014, 00:56   #22
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

безтолку, горох об стену
eval вне форума Ответить с цитированием
Старый 15.05.2014, 00:59   #23
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Конечно без толку, если ты даже на факты (программу) смотреть не хочешь.
doktor255 вне форума Ответить с цитированием
Старый 15.05.2014, 01:06   #24
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

если вы измеряете количеством срок кода, то дальше говорить что воду в ступе толочь..
порыскайте к примеру как циклы ифами разворачивают для ускорения, может чего и поймете
eval вне форума Ответить с цитированием
Старый 15.05.2014, 02:42   #25
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Думаю, doktor255 имеет ввиду количество инструкций, а не строк кода, только из-за плохого знания ассемблера не разобрался в происходящих там действиях. Повторил эксперимент JUDASа, только теперь процедуры содержали один вариант из тестирующихся, а не оба один за другим (из-за этого были "лишние" инструкции, а некоторых не хватало).
1)
Код:
var
  x: integer;
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b: integer;
begin
  if x < a then
    if x < b then
      x := 1;
end;
Код:
Unit1.pas.31: if x < a then
004A3B60 3B05AC224B00     cmp eax,[$004b22ac]
004A3B66 7E12             jle $004a3b7a
Unit1.pas.32: if x < b then
004A3B68 3B15AC224B00     cmp edx,[$004b22ac]
004A3B6E 7E0A             jle $004a3b7a
Unit1.pas.33: x := 1;
004A3B70 C705AC224B000100 mov [$004b22ac],$00000001
2)
Код:
var
  x: integer;
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b: integer;
begin
  if (x < a) and (x < b) then
    x := 1;
end;
Код:
Unit1.pas.35: if (x < a) and (x < b) then
004A3B60 3B05AC224B00     cmp eax,[$004b22ac]
004A3B66 7E12             jle $004a3b7a
004A3B68 3B15AC224B00     cmp edx,[$004b22ac]
004A3B6E 7E0A             jle $004a3b7a
Unit1.pas.36: x := 1;
004A3B70 C705AC224B000100 mov [$004b22ac],$00000001
Как видно, количество инструкций совпало.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 15.05.2014 в 02:44.
BDA вне форума Ответить с цитированием
Старый 15.05.2014, 08:38   #26
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

мало того что кол-во совпало, так и они одни и теже, что какбы намекает.
и это при одних настройках, а вот поменяйте к примеру то что уже говорил Serge_Bliznykov еще в самом начале, и посмотреть во что выльеться
вот про то я и говорил тоже еще в самом начале, что надо по месту в конкретном случае смотреть, а не в "общем", т.к. такого не бывает
eval вне форума Ответить с цитированием
Старый 15.05.2014, 08:40   #27
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от BDA
Как видно, количество инструкций совпало.
А если включить опцию компилятора {$B+}
Цитата:
The $B+ State:In the $B+ state, the compiler generates code for complete boolean expression evaluation.
Ассемблерный код для if (x < a) and (x < b) then как то поменяется?


UPDATED
eval, когда писал свой пост сегодня, ваш ответ ещё не видел. А по сути мы об одном и том же написали.

кстати, проверил.
с коротким вычислением у меня в Delphi код выглядит так:
boolean_short.jpg

если включить полное вычисление:
Код:
var
  x: integer;

{$B+}
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b: integer;
begin
  if (x < a) and (x < b) then
    x := 1;
end;
то код разительно меняется:
boolean_complete.jpg

p.s. а вообще, зачем всё это?!!!!
Ну очевидно же, что если при проверке условий не используются "тяжёлые" по производительности функции, то выигрыша в любом случае ПРАКТИЧЕСКИ не будет (нужно крутить циклы в миллиарды раз, чтобы хоть какое-то время выполнения засечь). Выигрыша в пару наносекунд добиваться явно не стоит. Поэтому нужно писать наглядный (и надёжный) код, а не думать, как съэкономить пару тактов процессорного времени. Тут же, имхо, явно не тот случай.

Последний раз редактировалось Serge_Bliznykov; 15.05.2014 в 08:56.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.05.2014, 10:48   #28
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от doktor255 Посмотреть сообщение
На скриншоте ассемблер, а не процессор. А то что в Caption cpu написано, ну так на заборе тоже пишут. Что -то ни кто не повторяет. Речь о ассемблере? Не вопрос. Я в ассемблере не очень разбираюсь, но что я точно знаю, что код выполняется построчно. В первом блоке я вижу шесть строк кода, во втором пять. Какой быстрее выполнится? Поразмышляй на досуге.
по количеству инструкций судить нельзя, Интел это не RISC процессор, где каждая инструкция за такт идет.
кстати говоря там на скриншоте коды не одинаковы, в первом случае включая обнуление переменной инструкций 7.
во втором случае нет кода обнуления переменной, и обхода этого обнуления при провале последней инструкции, и итого инструкций 5.
то есть код должен был быть идентичным.

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

Оптимизации таких выражений описаны много раз.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 15.05.2014 в 11:44.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
условие С++ svkpro Помощь студентам 2 28.11.2012 00:54
условие If Артем1999 C++ Builder 2 10.07.2012 15:01
Условие if revaldo666 Общие вопросы C/C++ 1 20.01.2012 01:50
условие Maka111 Microsoft Office Excel 5 17.05.2009 18:25