опять поторопился и сделал функцию, которая всегда вернет -1
Выход из процедуры родителя
Модератор: Модераторы
Лекс Айрин
опять поторопился и сделал функцию, которая всегда вернет -1
опять поторопился и сделал функцию, которая всегда вернет -1
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
SSerge, поменяй условие цикла. "=" --> "<>"
В книге, аргументировано, пояснялось применение exit в подобных дИяниях. И чем чреваты маленькие артефакты (у которых ноги длин..ны). К сожалению варианты модификации часто чреваты не заметными последствиями, о коих и предупреждал автор (фактически проверено на собственном опыте).
Смысл этого не уважаемого готу в повышении скорости деяния (в примере) и вылизано автором дай боже (т.е., если ему верить то тесты проводились не в течении 5 минут и не на одной версии дельфина). Сам оттудаво некоторые вещи брал (грешен, ну а если оно реально быстрее получается че не "подтянуть" под свои нужды
).
п.с.
sign правильно написал вариант. Но на момент написания книги такого варианта еще не было (если правильно понимаю, книжица то старенькая (D1-D5)). Но, по сути скорость от этого не возрастет, просто меньше на пару строк.
Но все это не касается сути вопроса (Выход из процедуры родителя)... Че толочь воду. Как умеем так и пишем. Если работает, значит чет умеем
Ранее goto в турбо пользовали и норм было. А сейчас "канитель" развели. Прикольно
Добавлено спустя 3 минуты 34 секунды:
кстати: не мудрите с функцией... Модуль не мохонький и есть "камушки". Для полноты картины судить по одной функции - бред. И написал её я для примера, а не для разбора...
Смысл этого не уважаемого готу в повышении скорости деяния (в примере) и вылизано автором дай боже (т.е., если ему верить то тесты проводились не в течении 5 минут и не на одной версии дельфина). Сам оттудаво некоторые вещи брал (грешен, ну а если оно реально быстрее получается че не "подтянуть" под свои нужды
п.с.
sign правильно написал вариант. Но на момент написания книги такого варианта еще не было (если правильно понимаю, книжица то старенькая (D1-D5)). Но, по сути скорость от этого не возрастет, просто меньше на пару строк.
Но все это не касается сути вопроса (Выход из процедуры родителя)... Че толочь воду. Как умеем так и пишем. Если работает, значит чет умеем
Ранее goto в турбо пользовали и норм было. А сейчас "канитель" развели. Прикольно
Добавлено спустя 3 минуты 34 секунды:
кстати: не мудрите с функцией... Модуль не мохонький и есть "камушки". Для полноты картины судить по одной функции - бред. И написал её я для примера, а не для разбора...
>>Вуаля, куда-то Exit делся.
Но должен появился Break, хрен редьки не слаще, темболее что присвоение + Break придется завернуть в begin-end
Избегание Exit - глупость, темболее под предлогом
>>Exit, это тот же Goto и, насколько мне известно, компилируется в команду безусловного перехода в бинарном коде.
Какая разница во что компилируется? Единственная проблема с Exit может быть в случае
Но должен появился Break, хрен редьки не слаще, темболее что присвоение + Break придется завернуть в begin-end
Избегание Exit - глупость, темболее под предлогом
>>Exit, это тот же Goto и, насколько мне известно, компилируется в команду безусловного перехода в бинарном коде.
Какая разница во что компилируется? Единственная проблема с Exit может быть в случае
Код: Выделить всё
procedure qwerty
begin
myInitialize(something);
//тут чтото делаем и exit нельзя использовать - something утекет
myFinalize(something);
end;IMHO простой exit нужен, но только если его использовать по назначению.
Сразу видно 2 варианта
1. В случае сложной процедуры/функции/метода сначала выполнить некоторые проверки, при несоблюдении которых дальше идти бесполезно, или же результат будет тривиальным. Конечно, можно сделать лишние операторные скобки, но на то они и лишние - код будет менее читаем, особенно если проверок несколько. Исключить вариант - и забыть, а то ведь очень легко наткнуться на случай, когда что-нибудь вставил в конец процедуры (разумеется, только для нужного варианта) - а оно будет работать всегда.
2. Если результат при определённых условиях может получиться уже где-нибудь внутри очередного цикла - можно, конечно, "пробросить" из цикла на выход, но это уже потребует лишнюю переменную
Сразу видно 2 варианта
1. В случае сложной процедуры/функции/метода сначала выполнить некоторые проверки, при несоблюдении которых дальше идти бесполезно, или же результат будет тривиальным. Конечно, можно сделать лишние операторные скобки, но на то они и лишние - код будет менее читаем, особенно если проверок несколько. Исключить вариант - и забыть, а то ведь очень легко наткнуться на случай, когда что-нибудь вставил в конец процедуры (разумеется, только для нужного варианта) - а оно будет работать всегда.
2. Если результат при определённых условиях может получиться уже где-нибудь внутри очередного цикла - можно, конечно, "пробросить" из цикла на выход, но это уже потребует лишнюю переменную
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zub писал(а):Какая разница во что компилируется?
Не скажите... Безусловный переход вызывает такой же безусловный сброс очереди выполнения программ. В случае условного есть вероятность избежать этого. Плюс риск получить "макаронный" код.
pupsik писал(а):В книге, аргументировано, пояснялось применение exit в подобных дИяниях.
Трулинк плиз. Я, допустим, так же аргументированно слышал, что выход из For нестандартным способом чреват мелкими последствиями.
>>Не скажите... Безусловный переход вызывает такой же безусловный сброс очереди выполнения программ. В случае условного есть вероятность избежать этого. Плюс риск получить "макаронный" код.
Результат найден, должен произойти выход из процедуры... В этот момент вероятность равна нулю. Откуда у вас уверенность что в варианте расстановкой нескольких екситов в теле цикла переходов будет больше, чем в варианте с очень ветвистым выражением выполнения в while или until?
Результат найден, должен произойти выход из процедуры... В этот момент вероятность равна нулю. Откуда у вас уверенность что в варианте расстановкой нескольких екситов в теле цикла переходов будет больше, чем в варианте с очень ветвистым выражением выполнения в while или until?
"Фундаментальные алгоритмы и структуры данных в Delphi" - у самого печатный вариант, но в инете есть. Мне кажется - это очень популярная книга. К сожалению, по алгоритмам, встречал только 2 нормальные (на русском для паскаля) книги. И де-факто озвученый, на порядок выше, чем вторая.
Вторая, для меня, - не удачная попытка показать крутость и получить облом. Хотя, написана красиво и на первый взгляд правильно (и даже аргуметы адекватные). Но, когда решил проверить, .... эти аргументы оказались выше моего понимания
, да и на практике % полученой информации ниже.
В принципе, как ранее писал, можно и так и эдак. Только, иной раз, эдак не соизмерим с так.
п.с.
повторюсь:
К примеру, не касаемо вопроса:
Судя по раскопкам в нашей системе N кол-во планет. Прошло время и оказалось что земля плоская, солнце вертитсо вокруг.... сейчас считают что у нас N-1 планет и вообще, возможно, опять вернемся к плоской...
И все описаное в примере вполне таки аргументировано. Как проверить это? Учитывая что машины времени нет и мы все еще "ползаем" по земле - НИКАК. Просто кто-то считает.
Книга (у меня она не одна и на полке они не валялись), для меня, вывод кого то о чем то. Но в этом варианте можно все проверить на практике. И сделать собственный вывод. Хотя книга, для меня, образное явление. Сколько форумов и всякой всячины (самая прикольная - китайская всячина
). Ну и практика...
Дык что... не о том спор...
Добавлено спустя 11 минут 25 секунд:
вы не поняли зачем в данном моменте применялся экзит...
а вот Лекс Айрин, если не ошибаюсь, понял
Вторая, для меня, - не удачная попытка показать крутость и получить облом. Хотя, написана красиво и на первый взгляд правильно (и даже аргуметы адекватные). Но, когда решил проверить, .... эти аргументы оказались выше моего понимания
для меня, к примеру, не является аргументом: exit=goto. Возможно, это повлияет на асемблерный код и очередной лаг (странно, у меня ни разу не было связаны лаги с экзитом... только ошибки, иной раз механические, или не продуманости логики).Я, допустим, так же аргументированно слышал,...
В принципе, как ранее писал, можно и так и эдак. Только, иной раз, эдак не соизмерим с так.
п.с.
повторюсь:
что изменит что я дам вам ссылку на страницу и абзац?Для полноты картины судить по одной функции - бред.
К примеру, не касаемо вопроса:
Судя по раскопкам в нашей системе N кол-во планет. Прошло время и оказалось что земля плоская, солнце вертитсо вокруг.... сейчас считают что у нас N-1 планет и вообще, возможно, опять вернемся к плоской...
И все описаное в примере вполне таки аргументировано. Как проверить это? Учитывая что машины времени нет и мы все еще "ползаем" по земле - НИКАК. Просто кто-то считает.
Книга (у меня она не одна и на полке они не валялись), для меня, вывод кого то о чем то. Но в этом варианте можно все проверить на практике. И сделать собственный вывод. Хотя книга, для меня, образное явление. Сколько форумов и всякой всячины (самая прикольная - китайская всячина
Дык что... не о том спор...
Добавлено спустя 11 минут 25 секунд:
Результат найден, должен произойти выход из процедуры
вы не поняли зачем в данном моменте применялся экзит...
а вот Лекс Айрин, если не ошибаюсь, понял
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
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
решил порытся в книге и .... стр140 (Массивы). описана причина добавления break в for... Там половина страницы "забита" этим почему. Если уж слишком принципиально, можно перечитать еще и "ткнуть" зачем же он применяет этот злополучный exit...
кстати:
Увы while чутку не подходит для решение задачи (да и если судить по мнению автора, и не только - на форумах уже были "праведные" битвы что быстрее, то с for будет быстрее (относительно согласен с этим мнением в связи с написаной цитатой ниже)).
п.с.
Хотя все описано для дельфина. А вот как дело обстоит с лазарем сложно составить общую картину. А готовой нет, только обрывки и то не всегда соответствуют реалиям
только я соглашусь с этим:
кстати:
ответ очевиден... используется pred, кажись, со злым умыслом (т.е. функция выдрата из контекста и не видно полной картины. Поэтому не зная зачем не стоит менять...).А зачем здесь For? Попробуем тогда так..
Увы while чутку не подходит для решение задачи (да и если судить по мнению автора, и не только - на форумах уже были "праведные" битвы что быстрее, то с for будет быстрее (относительно согласен с этим мнением в связи с написаной цитатой ниже)).
п.с.
Хотя все описано для дельфина. А вот как дело обстоит с лазарем сложно составить общую картину. А готовой нет, только обрывки и то не всегда соответствуют реалиям
ассемблер - силаколичество инструкций в дизассемблированном коде
только я соглашусь с этим:
Не важен рассматриваемый случай. Важно то что имелось ввиду...Очень трудно оценить быстродействие каждого из приведенных кодов только по самому их виду. Это основной принцип, которому мы должны всегда следовать: нельзя оценивать скорость работы кода по его виду. Единственным методом определения быстродействия должно быть его выполнение. И только. Если есть возможность выбирать между несколькими алгоритмами, как в рассматриваемом случае, то для выбора более эффективного алгоритма с нашей точки зрения нужно оценить время выполнения кода в различных условиях и на различных исходных данных.
>>количество инструкций в дизассемблированном коде Jmp
Оптимизация включена? обычно оптимизированый код выглядит гораздо страшнее лобового-неоптимизированого))
Во первых - примерчик надо пореальнее, чтоб было несколько точек выхода из процедуры. Во вторых - это ни о чем не говорит, считать надо физические сбросы конвейра во время выполнения))
390 vs 388 vs 389 - эти цифры должны быть на совести оптимизатора, а никак не заставлять програмиста шлепать ветвисто-нечитаемые конструкции.
Оптимизация включена? обычно оптимизированый код выглядит гораздо страшнее лобового-неоптимизированого))
Во первых - примерчик надо пореальнее, чтоб было несколько точек выхода из процедуры. Во вторых - это ни о чем не говорит, считать надо физические сбросы конвейра во время выполнения))
390 vs 388 vs 389 - эти цифры должны быть на совести оптимизатора, а никак не заставлять програмиста шлепать ветвисто-нечитаемые конструкции.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
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что и требовалось доказать - компилятор вмешивается в структуру программы сводя разные варианты быдлокода к примерно одному оптимальному. exit, if - прочие выкрутасы - по сути одно и тоже разными словами
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zub, но вот что интересно, вариант с exit хоть на 1байт, но отличается сильнее от остальных. Плохо, что тяжело узнать что это за байты.
Не могу понять, нафига вы это дизассемблируете.
Оттранслируйте что ли в ассемблерный листинг и сразу будет видно во что перейдет та или иная конструкция. С привязкой к исходному паскалевскому коду.
Оттранслируйте что ли в ассемблерный листинг и сразу будет видно во что перейдет та или иная конструкция. С привязкой к исходному паскалевскому коду.
