1. Pascal / Говнокод #27031

    −1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    // добавляем новые ссылки
      for i := 0 to ATags.Count - 1 do
      begin
        // так мне кажется лучше
        Application.ProcessMessages;

    кому или чему лучше кроме тебя, автор ?

    Запостил: xoodoo, 15 Октября 2020

    Комментарии (163) RSS

    • Переведи на "PHP".
      Ответить
    • зачем ?
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • Юзеру лучше, видимо. Винда не ругается, что окно не отвечает.
      Ответить
      • Зачем делать что-то тяжелое на главном треде, если ты не игра?
        Ответить
        • В делфи не было удобных абстракций над тредами. Ну и многопоточность опять же тянет за собой лочки и т.п.

          Заблочить UI прогрессбаром (чтобы юзер никуда не тыкнул) и дёргать ProcessMessages (чтобы не висело) на порядок проще.
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • > кооперативная многозадачность

              Скорее эмуляция старой доброй однозадачной системы. Когда можно было просто нарисовать юзеру прогрессбар с кнопочкой отмены и заняться расчётами, периодически проверяя мышку с клавой.
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • Причём по аппаратному прерыванию задача TSR вытесняла все остальные задачи. В принципе, программа могла потеснить TSR'ы, выполнив инструкцию CLI. Однако, было немаскируемое прерывание №2 (NMI), которое этой инструкцией не маскировалось. Однако, и его можно было замаскировать, перепрограммировав контроллер прерываний.

                  Блядь, как всё сложно.
                  Ответить
                  • NMI же не дёрнуть самому?
                    Ответить
                    • А инструкцией INT 2?
                      Ответить
                      • Так не честно. От явного вызова int ты ничем не замаскируешься.
                        Ответить
                        • Кстати, контроллер прерываний я зря упомянул. Он же обрабатывает только IRQ (прерывания 0x08 — 0x0F и 0x70 — 0x77, если я не путаю). А сигнал для NMI приходит по другим ножкам. И маскируются NMI они через какой-то отладочный регистр. Придётся гуглить, короче.
                          Ответить
                          • Короче странное это NMI, по сути аналог нынешнего MCE - репорт о том, что железу совсем хуёво.
                            Ответить
                      • Честных способов получается два:

                        - послать сигнал снаружи через соотв. пин процессора
                        - кинуть IPI через APIC (но во времена DOS его не было)
                        Ответить
                        • >> The first APIC was the 82489DX – it was a discrete chip that functioned both as local and I/O APIC. The 82489DX enabled construction of symmetric multiprocessor (SMP) systems with the Intel 486 and early Pentium processors.

                          Во времена «четвёрок» и первых «пней» «DOS» ещё активно использовали.
                          Ответить
                          • Офигеть, они его ради серверов запилили? На десктопе в то время SMP явно никто не юзал.
                            Ответить
                            • > На десктопе в то время SMP явно никто не юзал.

                              Лол, ты мне напомнил очень смешное предсказание создателя OCaml [1]:

                              Самая мякотка:

                              > Shared-memory multiprocessors have
                              never really "taken off", at least in the general public. For large
                              parallel computations, clusters (distributed-memory systems) are the
                              norm. For desktop use, monoprocessors are plenty fast. Even if you
                              have a 4-processor SMP machine, it isn't clear whether you should
                              write your program using shared memory or using message passing -- the
                              latter is slightly more expensive, but scales to clusters...

                              > What about hyperthreading? Well, I believe it's the last convulsive
                              movement of SMP's corpse :-) We'll see how it goes market-wise. At
                              any rate, the speedups announced for hyperthreading in the Pentium 4
                              are below a factor of 1.5; probably not enough to offset the overhead
                              of making the OCaml runtime system thread-safe.

                              [1] https://groups.google.com/forum/?_escaped_fragment_=msg/fa.caml/0CN8LIYDX0Y/xMsXNbB5csoJ
                              Ответить
                              • То есть мультиядра и гипертрединг на бытовых компьютерах — это мошенничество, чтобы содрать с покупателей побольше денег?
                                Ответить
                                • OCaml на это мошенничество до сих пор не повёлся, хотя подвижки есть вроде. Плавающий питух — тоже мошенничество, ибо только двойной питух масштабируется на кластеры.
                                  Ответить
                                  • Нет тредов - нет проблем с ними. В общем-то норм ход с точки зрения предсказуемости кода.
                                    Ответить
                                  • А какую архитектуру создатель OCaml'а считает единственной вменяемой?
                                    Ответить
                              • показать все, что скрытоvanished
                                Ответить
                                • > у гиловцев

                                  (запрещённой на территории с++ организации)

                                  Не усложнив скорость и не уронив код.
                                  Ответить
                                • > Python
                                  > не уронив скорость

                                  ^___~
                                  Ответить
                                  • Ну они таки ускорили GIL. Первый был вообще анскилльным и трешил ядра от любой многопоточной нагрузки. А от ctrl-c вместо выхода превращался в cpu burn.
                                    Ответить
                                    • Поэтому я за "Erlang". SMP там был со времён царя гороха, эриксоновцы просто взяли и запилили.
                                      Ответить
                                  • В это трудно поверить, но не только ПХПшники обсуждают какие кавычки быстрее. У питонистов тоже есть свои хитрости:
                                    https://stackoverflow.com/questions/41565219/why-can-using-slots-make-attribute-access-faster

                                    Какая вообще самая быстрая скриптуха сейчас? JS с JITом?
                                    Ответить
                                  • > ^___~
                                    Именно поэтому я за «Numba».
                                    Ответить
                                    • ты его форсил, я помню, и я проверял, и получились очень крутые результаты

                                      но джитится, понятное дело, далеко не всё)
                                      Ответить
                          • показать все, что скрытоvanished
                            Ответить
                            • В теории я могу запустить APIC и пробудить остальные ядра, а потом сделать вид, что ничего не было...
                              Ответить
                              • а остальные ядра будут крутиться, и греть воздух?

                                Емнип, там нужно поставить в памяти спец трамплин, и послать IPI другим ядрам. Они проснутся, полезут в трамплин, ну и дальше куда он их направит
                                Ответить
                                • Дык я подставлю им трамплин в свой код и буду их юзать. А "DOS" об этом не узнает.
                                  Ответить
                              • Типа как «нереальный режим», когда переключаешься в защищённый, ставишь лимиты по 4 гига, а потом возвращаешься и делаешь вид, что ничего не было?
                                Ответить
                                • показать все, что скрытоvanished
                                  Ответить
                                  • Потому что тогда не было двух ядер?
                                    Ответить
                                    • показать все, что скрытоvanished
                                      Ответить
                                      • int main() {     int main() {
                                            // thread 1      // thread 2
                                        }                }
                                        Ответить
                                      • Здравствуйте! С вами мастер игры и вот его решение:
                                        https://www.gamedev.ru/code/forum/?id=19939

                                        Тот самый код на второй странице.
                                        Ответить
                                        • показать все, что скрытоvanished
                                          Ответить
                                          • Там, кстати, есть реально рабочий код на «Паскале»:
                                            Begin               Begin               Begin              Begin              Begin
                                             Begin               Begin               Begin              Begin              Begin
                                              Write('H   H ');    Write('EEEEE ');    Write('L     ');   Write('L     ');   Writeln(' OOO ');
                                              Write('H   H ');    Write('E     ');    Write('L     ');   Write('L     ');   Writeln('O   O');
                                              Write('HHHHH ');    Write('EEE   ');    Write('L     ');   Write('L     ');   Writeln('O   O');
                                              Write('H   H ');    Write('E     ');    Write('L     ');   Write('L     ');   Writeln('O   O');
                                              Write('H   H ');    Write('EEEEE ');    Write('LLLLL ');   Write('LLLLL ');   Writeln(' OOO ');
                                             End;                End;                End;               End;               End;
                                            End;                End;                End;               End;               End.
                                            Ответить
                                          • А ещё там была шиза про торсионные поля и вихревое программирование:
                                                     . . }          
                                                   .    ( .         
                                                 {   1     .)       
                                                )  i    (..)   {    
                                               .      0      {   .  
                                               .  a  n     v  .     
                                               (     i      o  . .  
                                               2   m  a    i   .    
                                                n       m d   }  .  
                                                 i   d      v       
                                                  a    i  o    }    
                                                    m        v      
                                                       d i o
                                            Ответить
                                          • Не зря я гейдев вспомнил. Значит, моя память не спит с другим.
                                            Ответить
                                        • показать все, что скрытоvanished
                                          Ответить
                                          • показать все, что скрытоvanished
                                            Ответить
                                            • Чтобы на CUDA писать нужно как минимум 100 мониторов, иначе каждую строчку по горизонтали скроллить придётся пять минут.
                                              Ответить
                                              • Код под CUDA на плоскости показать не получится. Нужно что-то в духе стопки из сотни-другой полупрозрачных мониторов, на каждом из которых видно код для 16 тредов.
                                                Ответить
                                                • Не обязательно. SIMD код просто редактируют с помощью Sublime Text, там лучшая поддержка multi-cursor editing.
                                                  Ответить
                                              • показать все, что скрытоvanished
                                                Ответить
                                                • Не все. Только в пределах одного варпа (тех самых 16 "тредов").

                                                  На других экранах ты можешь другой код написать при желании.
                                                  Ответить
                                                  • показать все, что скрытоvanished
                                                    Ответить
                                                    • Ага.
                                                      Ответить
                                                    • А теперь представь сколько тредов тебе придётся написать для пост-обработки каждого пикселя на 4к экране.

                                                      Геймдев - очень скучное занятие, походу.
                                                      Ответить
                                                      • показать все, что скрытоvanished
                                                        Ответить
                                                        • Для синхронизации тебе нужно провести барьер:
                                                          // примерно так
                                                              a[0] = 1;    a[1] = 1;
                                                          // -----------------------
                                                              x = a[1];    y = a[0];
                                                          Ответить
                                                          • а если я не хочу остальные треды тормозить об этот барьер, я вроде могу сделать вот такую воронку:
                                                            // примерно так
                                                                a[0] = 1;    a[1] = 1; some_Fun()
                                                            // ------------------------\                   /-----
                                                                x = a[1];    y = a[0];


                                                            но там нужно название функции по короче выбрать, иначе не пролезет. Потому в сишке такие короткие названия обычно?
                                                            Ответить
                                                            • Ну да, ты даже можешь изогнуть его для оптимизации, чтобы пустыми строками не разбавлять код:
                                                              // вот так
                                                                 a[0] = 1;    a[1] = 1;     a[2] = 1;
                                                              // -----------------------\\  a[2] += 1; 
                                                                 x = a[1];    y = a[2]   \\-------------
                                                                 x *= 2;      y *= 2;       z = a[0];
                                                              Ответить
                                                              • А вообще почему исполние идет сверху вниз? потому что intel?
                                                                Вот стек же может на разных архитектурах в разную сторону расти, и байтордер может быть разный.
                                                                Если я пишу под Sparc, то у меня код вверх идет, или в бок?
                                                                Ответить
                                                                • > байтордер
                                                                  int x;char y;int z; // эти переменные упакованы
                                                                  int x; char y; int z; // а между этими есть паддинг
                                                                  
                                                                  gnol x; // little-endian
                                                                  long x; // big-endian
                                                                  nglo x; // pdp-endian
                                                                  Ответить
                                                                  • Я так структуру оптимизировал для 32-х битного режима.
                                                                    struct foo {
                                                                        uint8_t a;
                                                                        uint8_t b;
                                                                    //1   
                                                                    //2    
                                                                       uint32_t c;
                                                                    }

                                                                    А потом под 64 пришлось переделывать
                                                                    struct foo {
                                                                        uint8_t a;
                                                                        uint8_t b;
                                                                    //1   
                                                                    //2
                                                                    //3   
                                                                    //4
                                                                    // 5
                                                                    // 6
                                                                       uint32_t c;
                                                                    }


                                                                    думаю, препроцессор использовать, чтобы он эти переносы строк встапвлял
                                                                    Ответить
                                                      • > А теперь представь сколько тредов тебе придётся написать для пост-обработки каждого пикселя на 4к экране.

                                                        Пиксельные шейдеры на Piet программируют, в MS Paint.
                                                        Ответить
                                        • показать все, что скрытоvanished
                                          Ответить
    • Автор есть говнокодер по неуважительной причине - никто кроме него не знает по какому чиху он воткнул в цикл обработку очереди оконных сообщений, да он и сам вряд ли знает, ему всего лишь "кажется".. Начитался букварей и воткнул)

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

      Сам же по себе Application.ProcessMessages не есть проблема, если он используется по уму, осознанно и только там где без него действительно сложно обойтись по объективным причинам
      Эти причины говнокодеру и следовало хотя бы кратко изложить ув комменте вместо своего школотного "кажется"
      Ответить
      • Рекомендую перейти на "PHP". Там такой хуйни нет.
        Ответить
        • Носовский Пилюлькин всех касторкой лечил, а ты свой пхп тычешь к месту и не к месту, даже не вдупляя о чём идёт речь)
          Рекомендую не рекомендовать.
          Ответить
      • В корне неверный подход и автор далеко не говнокодер. Он пытается обойтись дрочкой, не прибегая к вульгарному совокуплению.
        Процессмессагес можно смело юзать, не забывая блокировать контролы, иначе возможен повторный вход в обработчики.

        Можно было сделать так:

        // добавляем новые ссылки
          for i := 0 to ATags.Count - 1 do
          begin
            // цикл - блокирующая операция
            Application.ProcessMessages;
            if Application.Terminated then Break;


        После чего форма начинает корректно реагировать на закрытие. Правда, больше ничего с ней сделать нельзя. И тем не менее, это не говнокод.
        Ответить
    • Смешной багор: один heavyweight компонент в свинге скролится мышкой в обратную сторону, причем только на винде, вызывая у всех бугор.

      heavyweight это нативное окошко операционки, которое получает от нее события, и перенаправляет их в джаву.

      Внимательный читатель сразу доагадется, чего не учли авторы компонента:
      https://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseWheelEvent.html#getWheelRotation()
      https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mousewheel (wParam)
      Ответить
    • На какой язык backend-разработки лучше всего переходить с уёбищного PHP?
      Ответить

    Добавить комментарий