goto - с любимыми не расставайтесь, или break не тащит

Любые обсуждения, не нарушающие правил форума.

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

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение runewalsh » 30.10.2020 21:41:07

iskander писал(а):А не пробовали сравнить однопоточную версию с другими реализациями?

А то как же! Она будет рвать вики-AnySort и TFPGList.Sort в клочья, но не из-за алгоритма сортировки, а из-за накладных расходов на тонну вызовов функции сравнения и Move; TFPGList, увы, тоже всё это делает, т. к. наследуется от универсального типа. У меня же сравнение задаётся макросом: например, для сортировщика по полю ref пользователь задаёт {$define less := _1.ref < _2.ref}. :D

Я переделал AnySort на дженерик-вариант без функции сравнения (вместо неё используется непосредственно оператор <) и Move, получив чистый quick sort. Отрыв моей сортировки от него уже не такой внушительный — 3,7 против 4,35 секунд (меньше 20%), это и есть непосредственный эффект главной оптимизации — отката на сортировку выбором для маленьких подмассивов.
Untitled-2.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось runewalsh 30.10.2020 21:48:43, всего редактировалось 1 раз.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 30.10.2020 21:48:30

Вот здесь реализовано изрядное количество различных сортировок. Как насчёт них?
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение runewalsh » 30.10.2020 22:51:36

Я бы проверил, но у меня lgenerics.lpk конпелироваться не хочет (Compilation raised exception internally). :(

Да, оно может быть ещё быстрее моего за счёт pdqsort и block quicksort — если верить интернету, то до 2 раз на случайных данных; или не быть. Я в такие дебри не лез, чтобы оставить размер кода (как бинарного, так и исходного) в разумных пределах. В частности, большой размер бинарного кода означает, что такая сортировочка, хотя сама выполнится быстро, может замедлить то, что будет выполняться после неё, вытеснив соответствующий код из кэша.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 30.10.2020 22:59:19

Емнип, если нужны только сортировки, то достаточно просто скопировать в проект LGUtils и LGArrayHelpers.
Или можете выложить компилируемый вариант кода вашей сортировки, я попробую сравнить сам.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Alex2013 » 31.10.2020 01:41:41

М да забавная штуковина ... Кстати уважаемый мной ХайАсм это можно сказать язык без Goto и это там довольно принципиально . (Но все прекрасно без Goto обходятся) Правда там есть другая неочевидная и в отличии от Goto реально 100%-ная гадость: так называемое "кольцевание". Все дело в том что цепочка вызовов элементов в ХайАсм это просто вызов одной функции через другую и нужно всегда держать в голове, что это не последовательное выполнение операторов а "длинная череда скобок" Фн1( Фн2(Фн3... ) ) ) и если Фн3 вызовет Фн1 то выполнение не вернется к началу, а запустит некое неуправляемое подобие рекурсии.
Разумеется есть способы "разрыва цепочки" точнее "обособления" ее участка + создание потоков + цепочки управляемые событиями и т.д .
Alex2013
долгожитель
 
Сообщения: 2948
Зарегистрирован: 03.04.2013 11:59:44

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 31.10.2020 09:57:45

Alex2013 писал(а):М да забавная штуковина ...

Которая именно?
Там выше по теме есть вопрос для знатоков, каков будет вердикт?

runewalsh, у меня пакет собрался штатным FPC-3.2.0-win64.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение runewalsh » 31.10.2020 12:25:40

iskander писал(а):у меня пакет собрался штатным FPC-3.2.0-win64

У меня транковый, может, ошибки из-за этого, либо ему чем-то мешает мой кастомный fpc.cfg.

Скопировал модули вручную вместо честной компиляции пакета, скомпилировалось.
Ну да, неблохо так. Уинты намного быстрее (почти в 2 раза!), строки чуть медленнее — скорее всего, как раз из-за большего количества сравнений. Немного поизучал тему в интернете (аффтор содрал алгоритм вот отсюда: https://github.com/orlp/pdqsort), оказывается, в QuickSort плохие ветвления, и наблюдаемое ускорение в 2 раза на случайных данных (!) получается как раз за счёт безбранчевой переделки
Untitled-3.png
.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 31.10.2020 13:42:27

runewalsh писал(а):аффтор содрал алгоритм вот отсюда: https://github.com/orlp/pdqsort

Ну так он так и пишет: "Pascal translation of Orson Peters' PDQSort algorithm".

Там есть ещё забавная дефолтная сортировка для ординалов.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Seenkao » 31.10.2020 13:45:35

Эх... потеряю тему, когда понадобится...
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение runewalsh » 31.10.2020 14:42:46

iskander писал(а):забавная дефолтная сортировка для ординалов

Оу, она на тех же данных отрабатывает за 430 мс, т. е. наполовину быстрее моей многопоточной. Спасибо, пойду вешаться.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 31.10.2020 16:00:51

Ага, мне тоже понравилось.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Alex2013 » 31.10.2020 20:15:13

iskander писал(а):Alex2013 писал(а):
М да забавная штуковина ...

Которая именно?

Вот эта ...
viewtopic.php?p=160606#p160606
(Вчера отвлёкся, а тут уже целую страницу нафлудили... ) :mrgreen:
Alex2013
долгожитель
 
Сообщения: 2948
Зарегистрирован: 03.04.2013 11:59:44

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Сквозняк » 01.11.2020 05:18:01

jsa писал(а):За GoTo на лабах, домашках и курсовых просто ставила 2 и посылала переделывать. А переделанное оценивала например 5 , зачеркивала и писала 4 за GoTo


Ещё в младших классах понял, что доверять учителям нельзя, а некоторые, так просто врут с умным видом. Эта преподша умных программ не пишет, она как инструктор по плаванию не умеющая плавать - сдай ей что просит, а все возможности изучай самостоятельно.

jsa писал(а):И как оказалось в итоге, без GoTo код не превращается в какашку. Совсем. Наоборот стал более читаем. Прост. Логичен.


И как оказалось, после таких горе преподавателей бывшие ученики считают, что паскаль язык учебный, не предназначенный для серьёзных задач.

jsa писал(а):А вот с ним, даже ваш утрированный пример выглядит как бред. Совершенно не читабелен.


Отлично же читается! Проверенно годами применения. Проблема только в малом количестве кода, его ещё нужно писать и писать, а с гото структура программы готова к добавлению кода. А вот горе преподаватели совсем не пишут про элементарные вещи в программировании, в книжках про это кукиш. Зато они борются с гото и учат делать простые программы, которые уже кем-то реализованы, то есть нафиг не нужны.
jsa писал(а):
Код: Выделить всё
   var q3,w3: byte;
    begin
    q3:=2;
    w3:=3;
    case q3 of
    1: procedure_something_there_on_half_the_screen_1(q2, w3);
    2: begin
       if w3>10 and not(w3>11) then procedure_something_there_on_half_the_screen_2_1(q2, w3);
       if w3<7 then procedure_something_there_on_half_the_screen_2_2(q2, w3);
       end;
    end;


У вас, извините, говно а не код для большой программы. Его тестировать надо чтобы быть уверенным в нормальной работе. И на каком основании слепили эту гадость?
Код: Выделить всё
procedure_something_there_on_half_the_screen_1(q2, w3);

Оператор case управлял объёмом кода под 100Кб и вы решили отфутболить всё это в какую-то процедуру, развести там срач????

Добавлено спустя 1 час 9 минут 43 секунды:
jsa писал(а):Вы через полгода сами забудете, что там навояли и не разберётся.Rad студия создана для облегчения труда архитекторов, что бы те могли напрягать простых кодеров.


Неправда ваша. Код с гото отлично читается, если соблюдать простые правила. Всё отлично продолжается. И более того, в сложном проекте нельзя всё время помнить все детали работы программы. Человеческой памяти не хватает на то чтобы помнить всегда. Озарение приходит к моменту окончания работы, а начинать её приходится с маленьким светильтников в замке без освещения. С гото всё чисто и конкрентно - вот тут написано и тут же реализация, а с РАД нужно помнить кучу интерфейсов, что они делают, чтобы прочитать код, без этого он куча хлама. Если повезёт, то по именам что-то можно угадать. А если в реализациях зарыт хак меняющий работу классов, то хренушки без чтения шпоргалки догадаешься что к чему, а прочитать её не факт что догадаешься - там много чего читать надо будет, до нужного места можешь в этот раз и не дочитаться. В результате, понимание работы займёт лишние дни.

Pavia писал(а):Это потому, что Вы языка не знаете. Указатели в паскале были с самого первого момента его появления. И тут всё в рамках стандарта.


А я и всех особенностей архитектур не знаю, не все имею чтобы протестировать. Потому не лезу с указателями куда не надо - не так напишешь и потом на другой тачке случится ошибка. Пусть указатели пишут по стандарту те, кто имеет возможность всё протестировать. Как работает написанный на них класс TForm, без ругани не описать. Если у коллектива так получилось, то уж лучше постараюсь обойти грабли.
Pavia писал(а):А пример есть у Вирта в его A2 (ОС Оберон)


Запускал её в виртуалке. Впечатления не слишком хорошие. Слишком в ней много английского. Это не есть хорошо.
Pavia писал(а):Перевел с Алгола 3 процедуры из 2-х разных источников ни одна Карл не заработала!


Доступ к памяти в защищённом режиме BP7 тоже в книжке с нерабочим примером. Сколько ни бился, фигня выходила. Пишет куда-то не туда, если много записать, то дос виснет. Для таких случаев принято в книжках писать не весь рабочий код, а его фрагмент, читатель когда будет набирать его в редакторе, станет достраивать недостающие куски и вину за его неработоспособность переложит на них, а автор останется чистеньким!

Добавлено спустя 20 минут 19 секунд:
Alex2013 писал(а):И еще, какой это к черту "умный оптимизатор" если он не умеет учитывать возможность применения примитивного и главное совершенно ШТАТНОГО ОПЕРАТОРА :?: :idea:


Тупые математики по формулам оптимизировали. У них такого оператора нет, вот и не умеют с ним работать - не вся логика доступна математике.

Добавлено спустя 9 минут 37 секунд:
zub писал(а):Не надо иронии, вот твой коллега часто не знает что он пишет и что происходит, списывая все на мистику и какие то загадочные инки и деки.

У меня тоже был такой мистический фрагмент кода, который работал невозможным образом. Потом оказалось, что компилятор рядом с ним в упор не видел синтаксическую ошибку и компилировал вместе с ней, от чего рядом код работал неправильно. Зато с гото "формулы" короче и компилятору сложнее ошибиться при их интерпретации. Компилятор иногда длинные формулы неправильно интерпретирует, а с гото такого ни разу не замечал.

Добавлено спустя 15 минут 54 секунды:
zub писал(а):>>нет в нормально написанной программе многоярусных циклов for которые надо прерывать

:mrgreen:
Код: Выделить всё
FUNCTION CITALNIK(IMJA_FAILA_SOHRANKI5: ANSISTRING;VAR S5: ARRAY OF STRING; VAR Z5: ARRAY OF ANSISTRING;LIMIT: LONGINT): BOOLEAN;
VAR
DLINA_A2: LONGINT=1000;
QQ3,ADRESA3: ARRAY OF BYTE;
ADRESA2: ARRAY OF LONGINT;
M2,E2,C2,I2,R2,Y2,T2: LONGINT;
KOLP: LONGINT;
Z64,X64: INT64;
LABEL
1,2,5,  99,100;
BEGIN
CITALNIK:=FALSE;
KOLP:=LENGTH(S5);
Z64:=SYSUTILS.FILEOPEN(IMJA_FAILA_SOHRANKI5, fmOpenRead);
IF IN_2(Z64,-1,VINDOFAILOBAG) THEN GOTO 100;
X64:=SYSUTILS.FILESEEK(Z64,0,2);
SYSUTILS.FILESEEK(Z64,0,0);
IF X64>LIMIT THEN X64:=LIMIT;
IF X64<1 THEN GOTO 99;
SETLENGTH(QQ3,X64+200);
FOR M2:=X64 TO X64+200-1 DO QQ3[M2]:=0;
M2:=X64;
E2:=0;
SYSUTILS.FILEREAD(Z64,QQ3[1],X64);
SETLENGTH(ADRESA2,DLINA_A2+2);
SETLENGTH(ADRESA3,DLINA_A2+2);
ADRESA2[0]:=1;
ADRESA2[1]:=X64;
ADRESA3[1]:=0;
C2:=0;
FOR E2:=1 TO X64 DO BEGIN
                    IF QQ3[E2] IN [10,13]=FALSE THEN GOTO 5;
                    IF QQ3[E2+1]<>36 THEN GOTO 5;
                    INC(C2);
                    IF C2>DLINA_A2 THEN BEGIN
                                        DLINA_A2:=DLINA_A2+2000;
                                        SETLENGTH(ADRESA2,DLINA_A2+2);
                                        SETLENGTH(ADRESA3,DLINA_A2+2);
                                        END;
                    ADRESA2[0]:=C2;
                    ADRESA2[C2]:=E2;
                    ADRESA3[C2]:=0;
5:
                    END;

FOR I2:=0 TO KOLP-1 DO BEGIN
                       Z5[I2]:='';
                       FOR C2:=1 TO ADRESA2[0] DO BEGIN
                                          IF ADRESA3[C2]=1 THEN GOTO 2;
                                          E2:=ADRESA2[C2];
                                          FOR R2:=1 TO LENGTH(S5[I2]) DO BEGIN
                                              IF QQ3[E2+R2+1]<>ORD(S5[I2,R2]) THEN GOTO 2;
                                              IF QQ3[E2+R2+1]=39 THEN BEGIN
                                                                      Y2:=1;
                                                                      ADRESA3[C2]:=1;
                                                                      FOR T2:=R2+1 TO X64 DO BEGIN
                                                                                             IF QQ3[E2+T2+1] {=10} IN [10,13] THEN GOTO 1;
                                                                                             Z5[I2]:=Z5[I2]+CHR(QQ3[E2+T2+1]);
                                                                                             IF QQ3[E2+T2+1]=39 THEN GOTO 1;
                                                                                             INC(Y2);
                                                                                             END;
                                                                      GOTO 1;
                                                                      END;
                                                                         END;
2:
                                                END;
1:
                       END;
99:
CITALNIK:=TRUE;
100:
SYSUTILS.FILECLOSE(Z64);
END;


Добавлено спустя 9 минут 5 секунд:
zub писал(а):Значение цикловой переменной не гарантируется вне цикла. поэтому такой код опасен, он может работать на данной платформе или на данной версии компилятора, но на следующей версии \ другой платформе вполне законно сломается


Для этого писать нужно так:
for a3:=1 to 100 do begin
if a3=x then goto 1;
if a3=100 then goto 1;
end;
1:

Для использования индексной переменной цикл for всегда должен завершаться через goto
Сквозняк
энтузиаст
 
Сообщения: 1110
Зарегистрирован: 29.06.2006 22:08:32

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 01.11.2020 10:01:37

Alex2013 писал(а):Вот эта ...
viewtopic.php?p=160606#p160606

Сам инициатор крестового похода против GOTO впоследствии говорил:
Edsger Dijkstra писал(а): Please don't fall into the trap of believing that I am terribly dogmatical about [the goto statement]. I have the uncomfortable feeling that others are making a religion out of it, as if the conceptual problems of programming could be solved by a single trick, by a simple form of coding discipline!

Один из последних встречавшихся мне пассажей насчёт GOTO принадлежит Торвальдсу:
Sun, 12 Jan 2003 12:22:26 -0800 (PST)
...
> However, I have always been taught, and have always believed that
> "goto"s are inherently evil. They are the creators of spaghetti code

No, you've been brainwashed by CS people who thought that Niklaus Wirth actually knew what he was talking about. He didn't. He doesn't have a frigging clue.

> (you start reading through the code to understand it (months or years
> after its written), and suddenly you jump to somewhere totally
> unrelated, and then jump somewhere else backwards, and it all gets ugly
> quickly). This makes later debugging of code total hell.

Any if-statement is a goto. As are all structured loops. And sometimes structure is good. When it's good, you should use it. And sometimes structure is _bad_, and gets into the way, and using a "goto" is just much clearer.
For example, it is quite common to have conditionals THAT DO NOT NEST. In which case you have two possibilities
- use goto, and be happy, since it doesn't enforce nesting
This makes the code _more_ readable, since the code just does what the algorithm says it should do.
- duplicate the code, and rewrite it in a nesting form so that you can use the structured jumps.
This often makes the code much LESS readable, harder to maintain, and bigger.

The Pascal language is a prime example of the latter problem. Because it doesn't have a "break" statement, loops in (traditional) Pascal end up often looking like total shit, because you have to add totally arbitrary logic to say "I'm done now".

Последний абзац этого пассажа, к тому же наглядно демонстрирует, что любой авторитет может с лёгкостью сморозить что-нибудь этакое не моргнув глазом.
Имхо религиозный подход в таких вопросах не кажется уместным.
Последний раз редактировалось iskander 01.11.2020 21:39:29, всего редактировалось 1 раз.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Снег Север » 01.11.2020 12:14:40

Повторю еще раз - программы на языках высокого уровня пишут для людей. Для ЭВМ пишут машинные коды. Соответственно, код, который малопонятен и нечитабелен - это говнокод. Вне зависимости от его прочих свойств. Без GOTO на паскале написать говнокод сложнее, чем с ним, хотя, если очень постараться, то можно...
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Пред.След.

Вернуться в Потрепаться

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

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

Рейтинг@Mail.ru