1. C++ / Говнокод #14504

    +42

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    #include <time.h>
    #include <string>
    #include <iostream>
    #include <functional>
    
    using namespace std::placeholders;
    
    class F
    {
            int inc;
    
    public:
    
            F( int inc_v ): inc( inc_v ) {};
    
            int calc( int x )
            {
                    return x + inc;
            };
    };
    
    F a1( -10 );
    F a2( 11 );
    
    int f1( int x )
    {
            return x - 10;
    };
    
    int f2( int x )
    {
            return x + 11;
    };
    
            struct my_ftor
            {
                    F *obj;
                    int (F::*meth)(int);
                    int operator()(int x)
                    {
                            return (obj->*meth)( x );
                    };
                    my_ftor() {};
                    my_ftor( F *x, int(F::*y)(int) ) : obj(x), meth(y) {};
            };
    
    template<typename functor_type>
    void test( std::function<functor_type(int)> filler, char *name )
    {
            const int size = 1000;
            const int iters = 10000;
    
            int beg_time, end_time;
    
            functor_type funcs[ size ];
    
            beg_time = clock();
            for ( int i = 0; i < iters; i++ )
            {
                    for ( int j = 0; j < size; j++ )
                    {
                            funcs[ j ] = filler(j);
                    }
            };
            end_time = clock();
            float creation = ((float)(end_time - beg_time) / CLOCKS_PER_SEC);
    
            beg_time = clock();
            int res = 0;
            for ( int i = 0; i < iters; i++ )
            {
                    for ( int j = 0; j < size; j++ )
                    {
                            res = funcs[ j ]( res );
                    };
            };
            end_time = clock();
            float execution = ((float)(end_time - beg_time) / CLOCKS_PER_SEC);
            std::cout << name << " creation time: " << creation << " execution time: " << execution << " result: " << res << "\n";
    }
    
    int main(int c, char * * v) 
    {
            test<int(*)(int)>( [](int i) {return i % 2 ? f1 : f2; }, "simple &function test" );
    
            test<std::function<int(int)>>( [](int i) {return i % 2 ? f1 : f2; }, "functor &function test" );
    
            test<std::function<int(int)>>( [](int i) {return i % 2 ? std::bind( &F::calc, &a1, _1 ) : std::bind( &F::calc, &a2, _1 ); }, "functor &object test" );
    
            test<my_ftor>( [](int i) {return i % 2 ? my_ftor( &a1, &F::calc ) : my_ftor( &a2, &F::calc ); }, "obj->*meth struct test" );
    
            std::cout << "END\n";
            return 0;
    }

    http://ideone.com/1iNzR
    Чем код так долго занимается?
    simple &function test creation time: 0.05 execution time: 0.09 result: 5000000
    functor &function test creation time: 0.51 execution time: 0.14 result: 5000000
    functor &object test creation time: 1.25 execution time: 0.14 result: 5000000
    obj->*meth struct test creation time: 0.12 execution time: 0.05 result: 5000000
    END

    Запостил: LispGovno, 05 Февраля 2014

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

    • Сложен путь крестовика.
      Нужно знать дофига.
      Ответить
    • тебе надо на StackOverflow перебираться.
      Ответить
      • Мне кажется основная проблема программистов в том, что они приходят в профессию, не изучив толком ассемблер. Они мыслят классами и методами. И за всей этой мишурой не видят настоящего машинного кода.
        У истоков Си стоял ассемблер. Любое выражение на Си порождало красивую последовательность ассемблерных инструкций. Программист писал на Си и видел процесс созидания кода. C++ стал закономерным продолжателем Си. Он сочетал в себе мощь ООП, сохранив возможность Видеть. Писать на C++, но видеть машинный код!

        А во что превращают язык теперь? Его обмазали синтаксическим сахаром, обвешали бесполезной мишурой. На каждое очередное извращение безумного программиста вводится очередная сахарная хрень, решая очередную бессмысленную задачу. Люди перестали видеть код, они видят только классы, методы, свойства, делегаты. Стыд! Стыд и позор.

        Я считаю, что вам всем давно пора вернуться к истокам. Научиться видеть машинный код. И учиться заново, сначала ассемблер, потом Си, а уже после C++2003. Это единственный путь к мудрости. А C++11 сжечь.
        Ответить
        • Годно. Прослезился.
          Ответить
        • У нас почему-то делали не так - сначала ООП, UML, жава, а потом уже системное программирование. Если следовать посту, есть риск получить нахуй никому не нужных Царей.
          Ответить
        • > Научиться видеть машинный код. И учиться заново, сначала ассемблер, потом LLVM, а уже после TarasBLang. Это единственный путь к мудрости. А C/C++ сжечь.
          Ответить
          • Вы решили разработать свой принципиально новый язык с нескучными обоями ?
            Ответить
            • Я уже давно думаю о языке с нормальной compile-time рефлексией, правда я пока стопорюсь на вопросе, как представлять функции. Видимо, функции и замыкания придётся делать принципиально разными сущностями.
              Ответить
              • что по вашему нормальная compile-time рефлексия ?
                Ответить
                • Это когда всё, что сейчас делается свиным поносом (свинья - это название идиомы, ага) - будет делаться простым и ясным кодом. И не только это. Вплоть до полного разбора тела функции.
                  Ответить
                  • js не ? там все просто и ясно. Уже и десктоп можно http://www.tidesdk.org/
                    Ответить
                  • Ясным кому?
                    Ответить
                    • пушкину
                      Ответить
                    • Зря вы так если к js привыкнуть то там все становится ясным и понятным. Конечно сахарку не хватает.
                      Ответить
                      • '5' + 3 = '53'
                        '5' - 3 = 2
                        Ответить
                        • Это вообще самое простое. Плюс так работает даже в жабе со строгой типизацией, было бы хуже, если ввели лишний говнооператор (как .. в Lua). А минусу просто некуда деться. '353' - 3 = '35' или '353' - 3 = '5' было бы менее очевидным.
                          Самое говно в JS - это сравнение. [,,]==','

                          Но если такой питуизационный багор, всегда можно избежать говна. Арифметические операторы использовать только с числами (кроме плюса, который ещё и для строк и только них), сравнивать только через === (кроме сравнения с null), не писать полиморфные функции (кстати, это поможет v8 сгенерить годный код), явно приводить переменные к нужному типу. Можно ещё JS выучить - говорят, помогает.
                          Ответить
                          • >Плюс так работает даже в жабе со строгой типизацией,
                            В жабе это - единственное исключение из правил строгой типизации. А жс - это одно сплошное исключение. Почитай wtf тред на stackoverflow, там половина про js.

                            >Арифметические операторы использовать только с числами
                            А как ты узнаешь, что в переменной? Типизация-то динамическая!
                            Ответить
                            • > Почитай wtf тред на stackoverflow, там половина про js.
                              Да я читал wtfjs.com, думаю, я представляю масштаб бедствия.

                              > А как ты узнаешь, что в переменной? Типизация-то динамическая!
                              var a = динамическая питушня;
                              Можно:
                              1. if(typeof a === 'number') // проверить
                              2. var a_num = Number(a); // похерить
                              Ответить
                              • Охблядь, в динамическом языке для нормальной работы надо явно проверить/привести типы, т.е. сделать из него статический. Слабая типизация не нужна!
                                Ответить
                                • > т.е. сделать из него статический.
                                  Только, если это необходимо, человек плохо жнает жс или у него бугурт от динамический типизации.
                                  Главное - чтобы программист знал, что в переменной может оказаться (число; строка; объект X; ...; всё, что угодно) и корректно обрабатывал, не сравнивая переменные с неизвестным типом через ==.

                                  > Слабая типизация не нужна!
                                  Люблю сишку и жс, воспринимаю как оскорбление чувств верующих.
                                  Ответить
                                  • >у него бугурт от динамический типизации.
                                    От слабой.

                                    Просто слабая типизация создает столько костылей (вспомните таблицу сравнения php), что что бы она не приносила - оно того не стоит.

                                    >и корректно обрабатывал, не сравнивая переменные с неизвестным типом через ==.
                                    Иначе говоря - отказ от слабой типизации, явная конвертация.
                                    Ответить
                                  • То, что плюс так работает - очень плохо, потому, что мы от плюса ожидаем определенное поведение, например, что а + б = б + а, а так же, что он относится определенным образом к другим функциям, а + 0 = а * 1 и т.д.
                                    Это помогает компилятору генерировать более оптимальный код.

                                    Что касается системы типов в ж.скрипте - она просто плохо продумана. Почему-то даты стали отдельным типом, строки и "массивы" не являются чем-то похожим, и вообще ближе к числам в плане обращения с ними. Есть мистический "класс" Math, который вроде и не класс, а вроде и класс. Регулярные выражения - иногда функция, а иногда объект. Нет возможности нормально проверить относится ли объект к определенному классу (подчерк, например, парсит результат от toString, instanceof не работает иногда изза проблем безопасности, сравнение прототипов - аналогично, isPrototypeOf - аналогично.

                                    Еще раз: проблема совсем не в том когда определяются типы, а в том как построена система их взаимодействия и каке у программиста есть возможности по отладке и конструированию.
                                    Ответить
                                    • ради интереса - а каким типом должна быть дата-время?
                                      Ответить
                                      • Должна быть? Я не знаю, но, понятное дело, что она состоит из нескольких частей, т.е. сложнее, например, чисел или объектов. Если бы в ж.скрипте была какая-нибудь иерархия во встроенных типах, то, в зависимости от ее организации дата могла быть, например, подвидом массива фиксированой длины, или подвидом числа, или просто аморфным объектом с неупорядоченым набором полей. Последнее - похоже на то, как она работает, но на самом деле не является (например, для дат приведение типов не работает - не унаследовано об объектов).

                                        Т.е. typeof Date(12345) == "string"
                                        Ответить
                                        • ну массив фиксированной длины - это совсем плохой вариант
                                          разница двух дат станет той ещё головной болью

                                          самое благоразумное хранить внутри даты число в виде счетчика от какой-либо эпохи + отдельно обрабатывать понятие временной зоны

                                          и насколько я понимаю, внутри оно так как раз и есть - счетчик миллисекунд (хотя в том же Oracle дата-время (date) хранит представление в числе с плавающей точкой, где целая часть - дни, дробная - дробная часть дня - т.е. время).

                                          > var x = new Date();
                                          undefined
                                          ....
                                          > var y = new Date();
                                          undefined
                                          > y - x;
                                          6953
                                          > Number(new Date());
                                          1391760234169
                                          > String(new Date());
                                          "Fri Feb 07 2014 12:06:40 GMT+0400 (Московское время (зима))"

                                          что не так?
                                          нет более удобных функций преобразования Date(), хранящего счетчик, в строку?
                                          Ответить
                                          • у тебя часы отстают
                                            Ответить
                                          • Да нет, не станет она головной болью... да и вообще, какое и кому до этого дело? Это головная боль разработчика АПИ языка, а не его пользователей.
                                            А то, что минус так работает для дат - это та же жопа, что и плюс для строк. Сэкономили на спичках, потеряли на покупке машины: то, что минус не работает так, как работает математическое отнимание делает работу компилятора неефективной, т.как многиe оптимизации становятся невозможными. При чем это делает работу неефективной не для дат, а для всего остального, что использует минус.

                                            ЗЫ. String(new Date()) - говнокод по определению, упрощается до Date().
                                            Ответить
                                            • > А то, что минус так работает для дат - это та же жопа, что и плюс для строк.
                                              > делает работу компилятора неефективной, т.как многиe оптимизации становятся невозможными.
                                              А это не проблемы динамической типизации вообще?
                                              (питушня) (оператор) (питушня) в любом случае будет работать медленнее, чем (известный тип) (оператор) (известный тип). По-моему, если известно, что (число) - (число) или (строка) - (число), то можно сгенерировать оптимальный код (во втором случае сделав (Number(строка)) - (число), где минус оптимален), а если (питушня) - (питушня), то нет.
                                              Ответить
                                    • > строки и "массивы" не являются чем-то похожим
                                      Честно говоря, они и так достаточно похожи. А если хочется изменяемых строк, можно использовать Buffer из node, или работать с массивами.

                                      > Есть мистический "класс" Math, который вроде и не класс, а вроде и класс.
                                      Чем Вам Math насолил?

                                      > x=Math.sin
                                      function sin() { [native code] }
                                      > x(3)
                                      0.1411200080598672
                                      > typeof Math
                                      "object"

                                      Нормальный объект. Или Вам не нравится, что надо писать "Math.sin", а не "sin", и для избавления от этого нельзя написать простое "using namespace Math"?
                                      Ответить
                                      • Почему у "нормального" объекта есть методы, но нет прототипа? Откуда он мог такой взяться, он что не наследуется от Object? Тогда какой же он объект?

                                        Динамической типизации не существует, это некорректное выражение. Есть только время, когда типы выводятся. И это только в контексте лямбда-кубических типов, а не любого подхода к типам. То, что минус работает не как минус, а как какая-то неведомая херня - это недостаток системы типов, вернее, АПИ языка, которые 1. позволили реализовать такое недоразумение, 2. реализовали такое недоразумение.
                                        Ответить
                                        • > Почему у "нормального" объекта есть методы, но нет прототипа?
                                          Это по стандарту нет, или в какой-то реализации?
                                          У меня в Chrome 32 есть:
                                          > Math.__proto__
                                          Object {}
                                          > Math.constructor
                                          function Object() { [native code] }
                                          > Math.constructor.prototype
                                          Object {}
                                          Ответить
                                          • А... очевидно моя инфа устарела. Когда-то давно не было.
                                            Зато вот, еще вспомнил, магический класс arguments.
                                            var args;
                                            (function () { args = arguments; })();
                                            args[1] = 42;
                                            (function (a, b) { console.log("a " + a + " b " + b); }).apply(null, args);
                                            // a undefined b undefined
                                            Ответить
                                            • Красивый пример.
                                              Правда, с учётом наличия геттеров/сеттеров/прокси магия arguments уже не так сильно шокирует.
                                              Вот undefined и Infinity - это да. Во-первых, почему тогда true, и null не lvalue? Во-вторых, раз теперь их не изменишь, почему присваивание не вызывает ошибки?

                                              Мне всегда грустно из-за того, что arguments - не массив. Когда срабатывает очередное Array.prototype.map.call(document.queryS electorAll('div.ok'), function ...);, умирает котёнок начинаешь думать, что они просто троллят со своими массивоподобными объектами.
                                              Ответить
                          • Мне в JS взорвало мозг наличие одновременно синтаксиса ClassName() и new ClassName(), которы делают разные вещи.
                            Ответить
                            • Какая разница?
                              Ответить
                              • ClassName() вызывает функцию ClassName, new ClassName() создаёт объект.
                                function ClassName(){
                                  this.x = 3;
                                  return 42;
                                }
                                var a = ClassName(); // a == 42
                                var b = new ClassName(); // b == {x: 3}
                                Ответить
                                • Пожалуй, этот пример достоин того, чтобы публиковаться отдельным говнокодом.
                                  Ответить
                                  • ClassName как конструктор не должен вызываться без new.

                                    консолька хрома выдает следующее

                                    function ttt(){ this.n=1}; console.log(ttt());
                                    undefined VM135:2
                                    undefined
                                    function ttt(){ this.n=1}; t= new ttt(); console.log(t.n);
                                    1 VM165:2
                                    undefined

                                    Хотя действительно не ругается молча отдает.

                                    function ClassName(){
                                    this.x = 3;
                                    return 42;
                                    }
                                    var a = ClassName(); // a == 42
                                    var b = new ClassName(); // b == {x: 3}
                                    console.log(a,b);
                                    42 ClassName {x: 3}
                                    Ответить
                                    • function ClassName(){
                                        if (this !== undefined) this.x = 3;
                                        return 42;
                                      }
                                      Ответить
                                      • А this можно сделать undefined?

                                        Хотя, если б даже можно было, никто не запретил бы сделать ClassName.call(new AnotherClassName) и испортить уже не глобальный объект, как в моём примере выше, а переданный.
                                        По-моему, лучше как-то так:
                                        function ClassName(){
                                          if (this instanceof ClassName) this.x = 3;
                                          return 42;
                                        }
                                        Ответить
                                        • > А this можно сделать undefined?
                                          В strict mode в этой ситуации он будет как раз undefined.
                                          Ответить
                                        • Ну вроде я встречал костыль типа такого:
                                          function ClassName() {
                                            if (typeof this == "undefined")
                                              return new ClassName();
                                            // А тут уже обычная инициализация
                                            this.answer = 42;
                                          }
                                          Ответить
                                        • >>А this можно сделать undefined?

                                          Ах тыж ебаный ты нахуй
                                          Ответить
                                          • Да там с андефайнед вообще какая-то питушня. Это почему-то даже не ключевое слово языка.
                                            Ответить
                                            • Даже так? Ужас
                                              Ответить
                                              • В былые времена, говорят, можно было присвоить переменным undefined и Infinity значения. Сейчас это пофиксили, но следы в языке и скриптах на сайтах ещё остались.
                                                Ответить
              • Так сделано ж уже...

                ЗЫ. А как ж.скрипт поможет с типизацией во время компиляции?

                ЗЫЫ. "Динамическая типизация" в этом контексте - разговор ни о чем. Обычно под "динамичностью" понимают, что определение типов (что бы мы типами не называли) откладывается на какое-то время. В ж.скрипте никто не запрещает вывести типы и потом его скомпилировать (тот же Юнити так и делает, например).
                Ответить
        • Кстати, какого года паста? В каком году она была актуальна?
          Ответить
          • Это свежак с гд.ру.
            http://www.gamedev.ru/flame/forum/?id=185727&page=4#m55
            Ответить
            • Дело Царя живет. Хотя в контексте гейдева байтодрочерство, видать, все еще в моде.
              Ответить
              • > байтодрочерство, видать, все еще в моде.
                Да там какие-то извращения в моде. Девушек наверн нет у них.
                Ответить
                • Почему? Годные ведь игры.
                  Ответить
                  • Это какие например? Ну и я про любовь велосипедить и юзать шаблонные или сишные ректальные методы. В соседний тред загляни со специальной олимпиадой.
                    Ответить

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