Выход из процедуры родителя

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Выход из процедуры родителя

Сообщение SSerge » 22.01.2015 11:56:59

Лекс Айрин
опять поторопился и сделал функцию, которая всегда вернет -1 :mrgreen:
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Выход из процедуры родителя

Сообщение Лекс Айрин » 22.01.2015 12:14:57

SSerge, поменяй условие цикла. "=" --> "<>"
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выход из процедуры родителя

Сообщение pupsik » 22.01.2015 12:23:54

В книге, аргументировано, пояснялось применение exit в подобных дИяниях. И чем чреваты маленькие артефакты (у которых ноги длин..ны). К сожалению варианты модификации часто чреваты не заметными последствиями, о коих и предупреждал автор (фактически проверено на собственном опыте).

Смысл этого не уважаемого готу в повышении скорости деяния (в примере) и вылизано автором дай боже (т.е., если ему верить то тесты проводились не в течении 5 минут и не на одной версии дельфина). Сам оттудаво некоторые вещи брал (грешен, ну а если оно реально быстрее получается че не "подтянуть" под свои нужды :D ).

п.с.
sign правильно написал вариант. Но на момент написания книги такого варианта еще не было (если правильно понимаю, книжица то старенькая (D1-D5)). Но, по сути скорость от этого не возрастет, просто меньше на пару строк.

Но все это не касается сути вопроса (Выход из процедуры родителя)... Че толочь воду. Как умеем так и пишем. Если работает, значит чет умеем :wink:
Ранее goto в турбо пользовали и норм было. А сейчас "канитель" развели. Прикольно :twisted:

Добавлено спустя 3 минуты 34 секунды:
кстати: не мудрите с функцией... Модуль не мохонький и есть "камушки". Для полноты картины судить по одной функции - бред. И написал её я для примера, а не для разбора...
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Выход из процедуры родителя

Сообщение zub » 22.01.2015 12:29:03

>>Вуаля, куда-то Exit делся.
Но должен появился Break, хрен редьки не слаще, темболее что присвоение + Break придется завернуть в begin-end
Избегание Exit - глупость, темболее под предлогом
>>Exit, это тот же Goto и, насколько мне известно, компилируется в команду безусловного перехода в бинарном коде.
Какая разница во что компилируется? Единственная проблема с Exit может быть в случае
Код: Выделить всё
procedure qwerty
begin
myInitialize(something);
//тут чтото делаем и exit нельзя использовать - something утекет
myFinalize(something);
end;
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Выход из процедуры родителя

Сообщение daesher » 22.01.2015 12:47:18

IMHO простой exit нужен, но только если его использовать по назначению.
Сразу видно 2 варианта
1. В случае сложной процедуры/функции/метода сначала выполнить некоторые проверки, при несоблюдении которых дальше идти бесполезно, или же результат будет тривиальным. Конечно, можно сделать лишние операторные скобки, но на то они и лишние - код будет менее читаем, особенно если проверок несколько. Исключить вариант - и забыть, а то ведь очень легко наткнуться на случай, когда что-нибудь вставил в конец процедуры (разумеется, только для нужного варианта) - а оно будет работать всегда.
2. Если результат при определённых условиях может получиться уже где-нибудь внутри очередного цикла - можно, конечно, "пробросить" из цикла на выход, но это уже потребует лишнюю переменную
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

Re: Выход из процедуры родителя

Сообщение Лекс Айрин » 22.01.2015 12:59:08

zub писал(а):Какая разница во что компилируется?

Не скажите... Безусловный переход вызывает такой же безусловный сброс очереди выполнения программ. В случае условного есть вероятность избежать этого. Плюс риск получить "макаронный" код.

pupsik писал(а):В книге, аргументировано, пояснялось применение exit в подобных дИяниях.

Трулинк плиз. Я, допустим, так же аргументированно слышал, что выход из For нестандартным способом чреват мелкими последствиями.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выход из процедуры родителя

Сообщение zub » 22.01.2015 13:23:44

>>Не скажите... Безусловный переход вызывает такой же безусловный сброс очереди выполнения программ. В случае условного есть вероятность избежать этого. Плюс риск получить "макаронный" код.
Результат найден, должен произойти выход из процедуры... В этот момент вероятность равна нулю. Откуда у вас уверенность что в варианте расстановкой нескольких екситов в теле цикла переходов будет больше, чем в варианте с очень ветвистым выражением выполнения в while или until?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Выход из процедуры родителя

Сообщение pupsik » 22.01.2015 13:48:24

"Фундаментальные алгоритмы и структуры данных в Delphi" - у самого печатный вариант, но в инете есть. Мне кажется - это очень популярная книга. К сожалению, по алгоритмам, встречал только 2 нормальные (на русском для паскаля) книги. И де-факто озвученый, на порядок выше, чем вторая.

Вторая, для меня, - не удачная попытка показать крутость и получить облом. Хотя, написана красиво и на первый взгляд правильно (и даже аргуметы адекватные). Но, когда решил проверить, .... эти аргументы оказались выше моего понимания :mrgreen:, да и на практике % полученой информации ниже.

Я, допустим, так же аргументированно слышал,...
для меня, к примеру, не является аргументом: exit=goto. Возможно, это повлияет на асемблерный код и очередной лаг (странно, у меня ни разу не было связаны лаги с экзитом... только ошибки, иной раз механические, или не продуманости логики).

В принципе, как ранее писал, можно и так и эдак. Только, иной раз, эдак не соизмерим с так.

п.с.
повторюсь:
Для полноты картины судить по одной функции - бред.
что изменит что я дам вам ссылку на страницу и абзац?

К примеру, не касаемо вопроса:
Судя по раскопкам в нашей системе N кол-во планет. Прошло время и оказалось что земля плоская, солнце вертитсо вокруг.... сейчас считают что у нас N-1 планет и вообще, возможно, опять вернемся к плоской...
И все описаное в примере вполне таки аргументировано. Как проверить это? Учитывая что машины времени нет и мы все еще "ползаем" по земле - НИКАК. Просто кто-то считает.

Книга (у меня она не одна и на полке они не валялись), для меня, вывод кого то о чем то. Но в этом варианте можно все проверить на практике. И сделать собственный вывод. Хотя книга, для меня, образное явление. Сколько форумов и всякой всячины (самая прикольная - китайская всячина :)). Ну и практика...
Дык что... не о том спор...

Добавлено спустя 11 минут 25 секунд:
Результат найден, должен произойти выход из процедуры

вы не поняли зачем в данном моменте применялся экзит...

а вот Лекс Айрин, если не ошибаюсь, понял :D
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Выход из процедуры родителя

Сообщение Лекс Айрин » 22.01.2015 15:48:29

zub писал(а):Откуда у вас уверенность что в варианте расстановкой нескольких екситов в теле цикла переходов будет больше, чем в варианте с очень ветвистым выражением выполнения в while или until


Уточню, безусловных переходов.

вариант1
Код: Выделить всё
program project1;
Var
  x:Byte;
begin
  Write('Введите число');
  readln(x);
  If x>2 then exit
  else  write(x);
  readln;
end.

количество инструкций в дизассемблированном коде Jmp =390
вариант2
Код: Выделить всё
program project2;
Var
  x:Byte;
begin
  Write('Введите число');
  readln(x);
  If x<=2 then  write(x);
  readln;
end.   

количество инструкций в дизассемблированном коде Jmp =388
Код: Выделить всё
program project2;
Var
  x:Byte;
begin
  Write('Введите число');
  readln(x);
  If x<=2 then  write(x)
  else begin end;
  readln;
end.   

количество инструкций в дизассемблированном коде Jmp =389

количество байт одинаковое = 57 900
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выход из процедуры родителя

Сообщение pupsik » 22.01.2015 16:04:26

решил порытся в книге и .... стр140 (Массивы). описана причина добавления break в for... Там половина страницы "забита" этим почему. Если уж слишком принципиально, можно перечитать еще и "ткнуть" зачем же он применяет этот злополучный exit...

кстати:
А зачем здесь For? Попробуем тогда так..
ответ очевиден... используется pred, кажись, со злым умыслом (т.е. функция выдрата из контекста и не видно полной картины. Поэтому не зная зачем не стоит менять...).
Увы while чутку не подходит для решение задачи (да и если судить по мнению автора, и не только - на форумах уже были "праведные" битвы что быстрее, то с for будет быстрее (относительно согласен с этим мнением в связи с написаной цитатой ниже)).

п.с.
Хотя все описано для дельфина. А вот как дело обстоит с лазарем сложно составить общую картину. А готовой нет, только обрывки и то не всегда соответствуют реалиям :(

количество инструкций в дизассемблированном коде
ассемблер - сила :roll:

только я соглашусь с этим:
Очень трудно оценить быстродействие каждого из приведенных кодов только по самому их виду. Это основной принцип, которому мы должны всегда следовать: нельзя оценивать скорость работы кода по его виду. Единственным методом определения быстродействия должно быть его выполнение. И только. Если есть возможность выбирать между несколькими алгоритмами, как в рассматриваемом случае, то для выбора более эффективного алгоритма с нашей точки зрения нужно оценить время выполнения кода в различных условиях и на различных исходных данных.
Не важен рассматриваемый случай. Важно то что имелось ввиду...
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Выход из процедуры родителя

Сообщение zub » 22.01.2015 16:40:49

>>количество инструкций в дизассемблированном коде Jmp
Оптимизация включена? обычно оптимизированый код выглядит гораздо страшнее лобового-неоптимизированого))
Во первых - примерчик надо пореальнее, чтоб было несколько точек выхода из процедуры. Во вторых - это ни о чем не говорит, считать надо физические сбросы конвейра во время выполнения))
390 vs 388 vs 389 - эти цифры должны быть на совести оптимизатора, а никак не заставлять програмиста шлепать ветвисто-нечитаемые конструкции.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Выход из процедуры родителя

Сообщение Лекс Айрин » 22.01.2015 18:15:10

zub, при оптимизации все изменения становятся минимальными, что не дает полноценной картины.



Код: Выделить всё
C:\test>fc project1.exe project3.exe
Сравнение файлов project1.exe и PROJECT3.EXE
00000832: 27 1D
0000A414: 31 33
0000A4C0: 31 33

C:\test>fc project2.exe project3.exe
Сравнение файлов project2.exe и PROJECT3.EXE
0000A414: 32 33
0000A4C0: 32 33

C:\test>fc project1.exe project2.exe
Сравнение файлов project1.exe и PROJECT2.EXE
00000832: 27 1D
0000A414: 31 32
0000A4C0: 31 32
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выход из процедуры родителя

Сообщение zub » 22.01.2015 18:45:01

что и требовалось доказать - компилятор вмешивается в структуру программы сводя разные варианты быдлокода к примерно одному оптимальному. exit, if - прочие выкрутасы - по сути одно и тоже разными словами
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Выход из процедуры родителя

Сообщение Лекс Айрин » 22.01.2015 19:14:15

zub, но вот что интересно, вариант с exit хоть на 1байт, но отличается сильнее от остальных. Плохо, что тяжело узнать что это за байты.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выход из процедуры родителя

Сообщение SSerge » 22.01.2015 19:34:07

Не могу понять, нафига вы это дизассемблируете.
Оттранслируйте что ли в ассемблерный листинг и сразу будет видно во что перейдет та или иная конструкция. С привязкой к исходному паскалевскому коду.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 222

Рейтинг@Mail.ru