1. JavaScript / Говнокод #13555

    +144

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    ;(function ($) {
    
    // alias Math methods - used a lot!
    var	min		= Math.min
    ,	max		= Math.max
    ,	round	= Math.floor

    lol

    Запостил: wvxvw, 06 Августа 2013

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

    • показать все, что скрытоЧто, неужели баян? Я не припомню что-то.
      Ответить
      • показать все, что скрытоА где смеяться-то? Человек соптимизировал, устранил лукап функции в объекте при вызове. Может, профита и нет, но говнокодом это сложно назвать.
        Ответить
        • показать все, что скрытоЗачем он floor переименовал в round? В чем оптимизация?
          Ответить
          • показать все, что скрытоЧтобы где-то ниже переименовать Math.round в floor, чего тут не понятного?
            Ответить
          • показать все, что скрытоОптимизация в количестве бит исходного кода
            Ответить
            • показать все, что скрытоКоличество битов исходного кода осталось неизменным, как до, так и после оптимизации. Заполненых битов, возможно, стало меньше, мне проверять лень, но вряд ли автор ставил перед собой такую задачу / эти переменные все равно переименовываются в минифицированом варианте.
              Ответить
          • показать все, что скрытоа нахрена jQuery называют $? В комменте же все написано — часто используются.

            А вот почему round = floor... Возможно специфично для решаемой задачи.
            Ответить
            • показать все, что скрытоО, есть идея, психотест для ж.квери программистов:

              |----------+----------+------------|
              | Math.max | Math.min | Math.floor |
              |----------+----------+------------|
              | max      | min      | ?          |
              |----------+----------+------------|
              
              [ ] - round
              [ ] - floor
              [ ] - none of the above
              [ ] - all of the above


              Еще раз, для особо недоверчивых. При замене переменной с именем round переменной с именем floor в минифицированном коде ничего не меняется. Нет и в принципе не может быть такой "специфической" задачи в которой потребовалось бы переименовать одну примитивную математическую операцию в другую. Все эти имена они только для того, чтобы "помочь" программисту читающему код.
              Ответить
              • показать все, что скрытоПопробую объяснить иначе.
                1. Почему вы все сводите к минифицированному варианту? Программист пишет обычный код, а не минифицированный. И каждый раз писать Math.min или Math.max или jQuery('#...') это лишние телодвижения. Не зря же в Java придумали import static. Сравните:
                Assert.assertEquals(a, b);
                Assert.assertTrue(condition);
                Assert.assertNotNull(reference);

                или
                assertEquals(a, b);
                assertTrue(condition);
                assertNotNull(reference);

                Здесь точно такая же ситуация, о чем и написано в комментарии. Я бы только alias заменил на shortcut.
                Данный пример - ТОЛЬКО СОКРАЩЕНИЕ КОЛИЧЕСТВА СИМВОЛОВ, КОТОРЫЕ НЕОБХОДИМО НАПИСАТЬ ПРОГРАММИСТУ. Дополнительный плюс - улучшение читаемости кода. Нет никаких оптимизаций - просто желание писать меньше.
                Ответить
              • показать все, что скрыто2. Замена round для Math.floor
                Абсолютно НОРМАЛЬНАЯ ситуация.
                round - функция ОКРУГЛЕНИЯ В ТЕРМИНАХ ЗАДАЧИ. Не важно, что там за функция.
                Когда программист читает код, он видит, что значение надо ОКРУГЛИТЬ. А правила округления устанавливаются в зависимости от контекста задачи.

                В 2D графике постоянно приходится использовать Math.floor как алгоритм округления по умолчанию. Только floor не так читаемо как round. Или, например, финансовый калькулятор, где результат надо округлить до целых, до десятков, до девяток на конце и т. п. Программисту важно знать, что результат будет округлен. А как он будет - это уже другое дело.

                В коде должна быть читаемость. Не зря в Ruby есть много alias'ов на один метод: size/count, hour/hours и т. п. В каждой конкретной ситуации, в зависимости от контекста, удобнее употреблять тот или иной alias.
                Ответить
                • показать все, что скрытоЯ где-то что-то говорил про замену Math.max на max? Где? Я этот код привел для того, чтобы был понятен контекст.
                  > Абсолютно НОРМАЛЬНАЯ ситуация.
                  Вы серьезно? Как вы определяете нормы? Если вы постоянно используете floor - ну так и используйте, зачем его переименовывать во что-то, чем он не является? А если вы прибавлением пользуетеcь чаще, чем умножение, вы будете называть прибавление умножением? В чем связь вообще?
                  Это ж каким феноменальным мудаком нужно быть, чтобы "подменить функцию округления" везде на что-то другое? А например конструктор массива вам не приходило в голову подменить, ну, чтобы паттерном "стратегия" воспользоваться, например, тоже замечательно работало бы:
                  Array = Date;
                  console.log(new Array(9, 10, 11, 12));
                  Ответить
                  • показать все, что скрытоВозможно вас смутила фраза "Замена round для Math.floor". Я имел ввиду:
                    var round = Math.floor;
                    ...
                    return round(value1 + value2);
                    ...

                    Ни больше и не меньше.

                    Может моя мысль так понятнее будет:
                    (function(min, max, round) {
                    ...
                    })(Math.min, Math.max, Math.floor);


                    ПС. К чему этот бред про конструкторы, замену сложения умножением, "подменить функцию округления везде"??? Я же не Math.round подменяю в конце концов.
                    Ответить
                    • показать все, что скрыто> Я же не Math.round подменяю в конце концов.
                      Но зачем-то назвали ее round. Во всех ваших примерах нет ни капли смысла. Хотите использовать round - используйте, хотите floor - используйте на здоровье, но нахера одно в другое переименовывать?
                      Ответить
                      • показать все, что скрытоВообще-то round, Math.round, App.round, YourApp.round это как бы РАЗНЫЕ функции. Почему я не могу свою функцию назвать round??? Мне что, нельзя написать
                        var round = function(value) { return Math.max(100, Math.floor(value));}

                        или может мне нельзя делать вызовы
                        (function(round) {...})(myOwnRoundFunction)


                        Или по вашему мнению я должен страдать проктологией в именовании типа myRound и т. п.?
                        Где вообще зафиксировано, что round должно использоваться в значении Math.round?
                        Ответить
                        • показать все, что скрытоПоддерживаю. floor - это частный случай округления, когда округление происходит к ближайшему меньшему числу. Криминала в коде не вижу. В обычной жизни даже не обратил бы внимания.

                          ОФФТОП: У меня тут коллеги макрос глобальный определили #define d(args...), вот это я понимаю, пи***ц.
                          Ответить
                        • ОК, в обратном порядке:
                          > Где зафискировано?

                          В коде приведенном выше. Автор (надеюсь, вы все его узнали) написал код, в котором создал правило: беру функцию "А.Б" и трансформирую ее в "А". И тут же похерил это правило, при этом похерил так, что сходу и не поймешь, что случилось.
                          О полезности того, что автор сделал тоже можно говорить только с улыбкой, но это отдельная тема.

                          > Или может мне нельзя делать вызовы?
                          Закройтесь в комнате, задерните шторы и вызывайте кого хотите. Это говно растекается по всему миру миллионам хомячков, и поэтому к нему немного другие требования.

                          > Страдать проктологией?
                          Навания дожны быть такими, чтобы не вызывать когнитивного диссонанса. Они должны быть максимально специфичными, и нужно избегать полисемии. Автор сделал все наоборот.
                          Вы хоть попробуйте представить какой-нибудь жизненный пример, в котором вам безразлично, используется ли round или floor.
                          Ответить
                        • Если увидишь слона в клетке с надписью "тигр" - не верь глазам своим.

                          Так зачем слона тигром то называть? Пусть слоном и остается.
                          Ответить
                          • Пара "тигр-слон" тут неуместна. Здесь больше подходит пара "тигр-кошка".
                            Или Вы удивляетесь записям вида List<...> items = new LinkedList<...>()? "Зачем слона LinkedList называть тигром List?"

                            Заметьте, автор кода работал в своём лексическом контексте, он не испортил Math. tir привёл хорошие аргументы и абсолютно верно всё описал. А то можно взять и запретить переопределять toString: надо же, объект вернёт не "[object ИмяКласса]", а что-то другое, и этим сломает функции, определяющие имя класса!

                            Не надо удивляться, если round - это:
                            function round(arr){
                              if(arr instanceof Array) return arr.map(round);
                              return Math.floor(arr);
                            }
                            // или
                            var value = 5.3;
                            var round = Math.round(value);
                            // или
                            const round = 'round';
                            Ответить
                            • Приведу наглядный пример, почему так делать... богомерзко.

                              Вот например в меню написано "Борщ". Заказываешь борщ - получаешь Суп харчо, потому что "Борщ" - это не "ПервыеБлюда.Борщ" а переопредление "ПервыеБлюда.СупХарчо". Обидно ведь?

                              А теперь остается вопрос - Почему "борщ", если это суп харчо? Какого хрена?
                              Ответить
                              • Да, это действительно богомерзко. Если вспомнить про крабовые палочки и царскую водку, вообще грустно становится.

                                Но всё же, floor - это round down, т.е. частный случай.
                                В терминах кулинарии:
                                суп - это round
                                борщ - это round up, или ceil
                                суп харчо - это round down, или floor

                                Вопрос уместности и тонкостей терминологии остаётся и активно обсуждается на этой странице, но автора кода следует помиловать :)
                                Ответить
                                • если его помиловать, он всегда будет делать так. Назвал бы RoundDown - не было бы вопросов.

                                  Ладно если проект домашний, а если нет? Вот достанется Вам код, в котором round будет означать flour тогда и поймете о чем я.

                                  Писать код нужно всегда грамотно
                                  Ответить
                                  • Автору не выгодно было бы называть "RoundDown", т.к "alias Math methods - used a lot!".

                                    > код, в котором round будет означать flour
                                    Понимание в этом случае может зависеть от алгоритма.

                                    Итак, подведём итоги холивара:
                                    Math.floor - длинновато, но стандартно и всем понятно, расово верный вариант
                                    round - коротко, подходит для некоторых алгоритмов, но может вводить в заблуждение.
                                    RoundDown - отражает суть, но длинновато
                                    floor - коротко, отражает суть, но может быть var floor = Math.ceil();
                                    Ответить
                            • Скажи мне, почему в ваше питух-языке в round() прилепили какое-то говно, аля Math(), да ещё с большой буквы?

                              Даже в питух плюсах это сделанно лучше math::round();, можно юзать тупо round() без всякого говна.

                              Синтаксис такое лютое говнище, что я просто не понимаю - как кто-то в здравом уме может писать на этом говне.

                              var - даже в питух плюсах с деланно лучше, ибо auto подходит лучше. Семантика говно.

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

                              Классификация объекдиняет готовые, разные объекты - это индексация. Вы же, питухи, всё наоборот - у вас класс основа. Т.к. ваше ООП ущербно - вы ограничиваете объекты, ибо максимум, что вы можете найти между кошками - это "жрать, бежать", хотя это бесполезно, ибо жрать и бежать могу все звери - и это обощение не имеет смысла, но зачем вам мозг.

                              А потом спорите о говне, фу.
                              Ответить
                              • Интересно было бы посмотреть на серьезный проект, в котором есть класс Кошка с методами Жрать и Бежать)
                                Ответить
                                • Будет кошка с методами жрать и бежать, а от неё будет наследованно 100500 говно, а на вопрос "нахрен вам тут наследование" - питушки будет кречать, что без него нельзя.

                                  Я не разу не видел профита от классов, как основу для объектов. Единственный профит от класса - это кастыль для прицепления общих данных к функциям - т.е. банальные глобальные методы, где класс - есть песочница.

                                  Во всех ООП смыслах класс провален, не имеет смысла, бесполезен и только мешает. Вместо того, чтобы биндить на функцию контекст - питушки юзают классы.

                                  Питушки кукарекают о компактности - но банальная сишка сливает в говно плюсовой классовый высер, а уж высер какого-нибудь жабаскрипта подавно. А уж банальный #define floor round просто в такую жламину запидаливает то говно, что вы родили выше, ибо это банальные неймспейсы.

                                  Меня это смешит, как одни питушки пытаются из ваше говна сделать Си-стайл код, другие питушки доказывают, что ООП круто. Хотя споси любого ЖС-гуру: "как писать" - он тебе скажет "хочешь понтово - юзай си-стайл" и будет прав, ибо он себе жопу порвал, когда писал жс-движок в броузёрке.


                                  Так же смишно, когда питушки юзают классы и пытаются эмулировать систайл, но не юзать классы они не могут по религиозным причинам. В конечном итоге имеет 99% классов с методами жрать и бежать, когда надо 100500 уникальных методов, либо 100500 обощенных методов, когда надо жрать и бежать. Вам рвёт жопу ваше говно со всех сторон.
                                  Ответить
                                  • > можно юзать тупо round() без всякого говна.
                                    Хотя бы #include писать придётся.
                                    Но я согласен, что Math каждый раз писать - уныло. Инклюды как в питоне были бы решением этого вопроса.

                                    > Синтаксис такое лютое говнище
                                    Нормальный синтаксис. Похож на сишку, много вкусностей.

                                    > var - даже в питух плюсах с деланно лучше, ибо auto подходит лучше.
                                    var короче и уместней, чем auto. Создать переменную, а не автофигню.

                                    > Ващее ООП тоже говно, ибо вы питухи нихрена не знаете о листах.
                                    > Она нужна нормальным пацанам, которые юзают десятки видов списков и то чисто форфан.
                                    ООП не только в листах проявляется, если им не злоупотреблять, можно писать разумный код.

                                    > Т.к. ваше ООП ущербно - вы ограничиваете объекты, ибо максимум, что вы можете найти между кошками - это "жрать, бежать"
                                    Вот и хорошо, то в JS не ООП. Тем полезны прототипы + возможность добавить поле в любой объект (поле, метод - не важно)

                                    > А потом спорите о говне, фу
                                    Спор ради спора. Всегда интересно поспорить хрен знает с кем из-за хрен знает чего. По-моему, этим живёт интернет.

                                    > Я не разу не видел профита от классов, как основу для объектов. Единственный профит от класса - это кастыль для прицепления общих данных к функциям - т.е. банальные глобальные методы, где класс - есть песочница.
                                    Реентерабельность - уже сильная сторона.
                                    Грамотное использование ООП позволит улучшить читаемость кода.
                                    Наследование полезно для обобщённого использования, чтобы не городить switchей.

                                    И да, я противник ООП. ООП должно использоваться только там, где оно уместно и может упростить работу программиста.
                                    Ответить
                                    • >Хотя бы #include писать придётся.
                                      Не придётся.

                                      >Нормальный синтаксис. Похож на сишку, много вкусностей.
                                      Не похож на сишку не разу - это твоя фантазия.

                                      >ООП не только в листах проявляется, если им не злоупотреблять, можно писать разумный код.
                                      Тут 2 пути - либо ты ООП-животное, либо ты понимаешь что это и юзаешь по делу, но когда ты понимаешь и юзаешь по делу - простота кода тебя не интересует.

                                      >Вот и хорошо, то в JS не ООП. Тем полезны прототипы + возможность добавить поле в любой объект (поле, метод - не важно)
                                      Это более-менее вменяемая альтернатива моего бинда. Ну и да, с биндом объекты не нужны - это уже машина состояний и совершенно другая парадигма, которую питушки не осилят.

                                      >Грамотное использование ООП позволит улучшить читаемость кода.
                                      Я уже гвоорил об этом. Когда человек осиливает ЯП - читаемость кода для него - это минимализм, красота и простота. ООП избыточен и не нужен - он нежен лишь для того, чтобы анскильные животные могли писать код.

                                      >Наследование полезно для обобщённого использования, чтобы не городить switchей.
                                      Не смеши мои тапки, какие свичи? Свич - это для питухов, я уже 10раз писал о том, как делается твоё ООП на ПРОсишке.


                                      >И да, я противник ООП. ООП должно использоваться только там, где оно уместно и может упростить работу программиста.
                                      Понимаешь в чём штука - Обощенность это тогда, когда ты объединяешь уже существующие объекты. Именно так пишут Цари. Вы же пишите криво - от обобщения к уникальности, хотя идёт от уникальности к обощению.

                                      Берётся набор уникальных объектов и ищется общее, а потом уже классифицируется. Общность - это уже следствие, его не надо создавать специально.

                                      Всё сводится к тому, что истинный программист вне парадигм, а питушок - заедушная макака, которая выучила одну технологию ваяния говно а ваяет говно за еду.
                                      Ответить
                                      • > Не похож на сишку не разу - это твоя фантазия.
                                        for, while, if, скобочки, формат чисел, строки, приоритет операторов, сами операторы.

                                        > ООП избыточен и не нужен - он нежен лишь для того, чтобы анскильные животные могли писать код.
                                        Анскильные животные и так пишут код, парадигма не важна. Разве что в ФП их меньше.
                                        Не надо выкидывать ООП, не дураки его придумали. ООП можно просто держать про запас, может пригодиться.

                                        > я уже 10раз писал о том, как делается твоё ООП на ПРОсишке.
                                        Тогда можно сразу бинарник писать и не гонять компилятор зря.

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

                                        > Всё сводится к тому, что истинный программист вне парадигм, а питушок - заедушная макака, которая выучила одну технологию ваяния говно а ваяет говно за еду.
                                        +100500
                                        Ответить
                                        • >for, while, if, скобочки, формат чисел, строки, приоритет операторов, сами операторы.
                                          Это есть ещё в 100500 других языков.

                                          >Анскильные животные и так пишут код, парадигма не важна. Разве что в ФП их меньше.
                                          Ещё как важна - ты попробуй без ООП чего-то написать - будет багет. В любой заедушной пописушке сначала ООП, потом код.


                                          >Не надо выкидывать ООП, не дураки его придумали. ООП можно просто держать про запас, может пригодиться.
                                          Надо. Ты не понимаешь для чего эти не дураки его придумали - для облегчения работы обезъянок, ибо это было на заре программного бума. Если твой скилл позволяет тебе понимать на уровне <5% - тебе не нужны никакие парадигмы и прочее говно. Все вещи из ООП юзались за долго до ООП.

                                          >Если отталкиваться от существующих объектов, придётся как раз по-царски их обобщать, если проектировать новый мир со своими объектами, можно и от обобщения к конкретным объектам пойти.
                                          ООПешники ничего не создают - они собирают кубики. Нет, даже если ты создаёшь мир - ты создаёшь один объект для какой-то цели, потом другой объект - и потом уже объединяешь, ибо в противном случае ты себя ограничиваешь и у тебя с шансом 100% выйдет говно.


                                          >А в общем-то, какая разница, главное - чтобы объекты, их иерархия и свойства не противоречили здравому смыслу
                                          Не нужно. Разница огромна.
                                          Ответить
                                          • > Это есть ещё в 100500 других языков.
                                            Не факт. Пусть for есть и в Pascal с Lua, но там надо end писать вместо скобочки. А сейчас придёт ТС напишет свой лисповский defun со скобочками.
                                            Сходство с сишкой заметно. Да, не в jQuery-высерах. В телах функций сходство есть.

                                            > Все вещи из ООП юзались за долго до ООП.
                                            +100500
                                            Особенно радует, когда пиарят инкапсуляцию и модульность в контексте ООП.

                                            > В любой заедушной пописушке сначала ООП, потом код.
                                            ООП ради ООП - зло. Это действительно так.
                                            Ответить
                                            • >Не факт. Пусть for есть и в Pascal с Lua, но там надо end писать вместо скобочки. А сейчас придёт ТС напишет свой лисповский defun со скобочками.
                                              Не, паскаль вообще не язык. В твоём жс так же много от паскаля, не меньше, чем от сишки. Но явное говнище, типа паскалевского фора, бегинов не попащили - видать не совсем идиотами были.


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

                                              Я ничего не имею против идей из которых сделали ООП - я ненавижу то говно, которое называют ООП, вернее ООП говного мозга. Юзать что-то это возможность, а не обязанность.
                                              Ответить
                                              • > Не, паскаль вообще не язык
                                                Не надо так. С паскаля многие начинали, писали свои первые программы.

                                                > Но явное говнище, типа паскалевского фора, бегинов не попащили
                                                зато в JS '0' == !'0', и это не баг, а фича.

                                                > высер идиотов, которые решили, что домохозяйки могут быть программистами.
                                                сколько понятий из мира IT под это определение попадает :)

                                                > Юзать что-то это возможность, а не обязанность.
                                                Помню, был у меня лютый баттхёрт, когда узнал, что в Java надо создать хоть один класс, чтоб написать программу.

                                                Хм, что-то я сегодня необыкновенно упорот. Надо пару-тройку дней выждать. Терпеть, комменты не писать, может отпустит.
                                                Ответить
                                                • >Не надо так. С паскаля многие начинали, писали свои первые программы.
                                                  Об этом они должны забыть, искупить грехи - исповедатся перез ричи и не упоминать об этом в приличном обществе.

                                                  >зато в JS '0' == !'0', и это не баг, а фича.
                                                  И в чём смысл?

                                                  >Помню, был у меня лютый баттхёрт, когда узнал, что в Java надо создать хоть один класс, чтоб написать программу.
                                                  Ну дак - жаба создавалась в момент программного бума.
                                                  Ответить
                                                  • >>Не надо так. С паскаля многие начинали, писали свои первые программы.
                                                    >Об этом они должны забыть, искупить грехи - исповедатся перез ричи и не упоминать об этом в приличном обществе.

                                                    Я с Qbasic начинал. Щас без слез смотреть не могу. И когда кто то говорит, что бейсик говно - меня это не задевает, ибо тут я солидарен.
                                                    Ответить
                                                    • А я начинал с плюсов - щас без слёз смотреть не могу. И когда кто-то говорит, что плюсы говно - меня это не задевает, ибо я итак знаю, что они говно и трублю об этом на каждом шагу.
                                                      Ответить
                                                  • > И в чём смысл?
                                                    Логическое преобразование !'0' в false, числовое преобразование '0' и false в 0 при сравнении. Побочный эффект преобразования типов, которое - фича, пока им не злоупотреблять.
                                                    Ответить
                                                    • Убери от меня это говно для питухов. В чём смысл в автокасте всего в ноль? Сишка в этом плане пидалит, и почему у вас бомбит от этого - яне понимаю. Своим говном с "преобразованиями" - вы убиваете вообще всю суть логики, оставляя лютое, бесполезное говно.

                                                      Хотя это примитивный ПЯП для примитивных задач - аля ваять говно для браузёрки. А требую я с этого говна как с сишки - непорядок, прости.
                                                      Ответить
                                                      • преобразования строка <-> число по крайней мере полезны для браузерного JS.

                                                        Весело было, когда я захотел по-быстрому написать на JScript.NET (хоть и не JS, но некоторые штуки ECMAScript за собой тянет, хоть и в нём есть фичи .NET) простую обработку изображений. Скорость не была особо важна, главное - возможность поэкспериментировать.
                                                        Но всё равно работало уж очень медленно. Из-за того, что при делении числа из целых преобразовывались в плавающие. Типы делимого и делителя были заданы, но всё равно преобразование выкурить не удалось.
                                                        Ответить
                                                        • Не юзай деление, если твой .net не может заменить деление на умножение - выкинь его. Целочисленное деление не особо быстрее флоата.

                                                          Меня смешат питушки, которые говорят, что "жс медленне сишки в 5раз", а когда им говоришь, что минимум на 2порядка - питушки начинают кукарекать, что в сишке юзать оптимизации нельзя, фичи х86 - юзать нельзя и прочее. Эти питушки даже не учитываю того, что в любой браузёрке под любую аппаратную платформу - тысячи х86/арм онли кода - но куда им.

                                                          Питухи, фу.
                                                          Ответить
                                                          • > Не юзай деление, если твой .net не может заменить деление на умножение - выкинь его.
                                                            Подозреваю, если использовать C#, ситуация будет лучше.

                                                            Вот, написал парочку примеров на C# и JScript.NET.
                                                            Тот, что на C#, выполняется у меня за 7.48с (с оптимизацией - за 6.3), а другой - за 19.22, хотя я, мать их, типы указал.

                                                            function count():int {
                                                              var x:int = 1, y:int = 1, s:int = 0;
                                                              const max:int = 1e9;
                                                              for(x=1; x<=max; ++x, ++y) s += x/y;
                                                              return s;
                                                            }
                                                            
                                                            var d = +new Date;
                                                            var s:int = count();
                                                            d = new Date - d;
                                                            print('Time: ' + d/1000 + 's.\ns = ' + s);


                                                            using System;
                                                            
                                                            class MainClass {
                                                            
                                                              static int count() {
                                                                int x = 1, y = 1, s = 0;
                                                                const int max = (int)1e9;
                                                                for(x=1; x<=max; ++x, ++y) s += x/y;
                                                                return s;
                                                              }
                                                            
                                                              static void Main(){
                                                                DateTime d = DateTime.Now;
                                                                int s = count();
                                                                TimeSpan ts = DateTime.Now - d;
                                                                Console.WriteLine("Time: " + ts.TotalMilliseconds/1000 + "s.\ns = " + s);
                                                              }
                                                            }
                                                            Ответить
                                                            • Ты написал тотальное говно - забудь о деление на не константу.
                                                              int main(void) {
                                                                double start_time = omp_get_wtime();
                                                                uint32_t x = 0, y = 0, res = 0;
                                                                while(++y, ++x < (uint32_t)1e9) res += (x/y);
                                                                fprintf(stderr, "%lf, %u\n", (omp_get_wtime() - start_time), res);
                                                              }


                                                              32битный инт 2.5сек -m64, 2сек -m32, ибо ггц питух только на -m32 нормально анролит. даблы 3сек, 32битные флоаты будут в районе 2-х, ибо чем длиннее число ты делишь - тем медленнее работает див.

                                                              Как мне померить твоё гумно?
                                                              Ответить
                                                            • Собрал v8 - 3.5сек, я выпилил типы - ибо он ругался
                                                              Ответить
                                                          • > Меня смешат питушки, которые говорят, что "жс медленне сишки в 5раз", а когда им говоришь, что минимум на 2порядка

                                                            Все питушки, кто говорят, что JS медленнее в N раз. Да, вероятность написать на C быстрее крайне велика, но дело в конкретном примере.

                                                            Кстати, такая штука в хроме 28м за 10.1с выполняется.
                                                            function count() {
                                                              var x = 1, y = 1, s = 0;
                                                              const max = 1e9 | 0;
                                                              for(x=1; x<=max; ++x, ++y) s += x/y;
                                                              return s;
                                                            }
                                                            
                                                            console.time('Time');
                                                            var s = count();
                                                            console.timeEnd('Time');
                                                            console.log('s.\ns = ' + s);


                                                            А вариант на сишке под GCC 4.5.2 с O3 - за 5.1с
                                                            #include <stdio.h>
                                                            #include <time.h>
                                                            
                                                            clock_t mytime(){ return clock() / (CLOCKS_PER_SEC / 1000); }
                                                            
                                                            int count() {
                                                              int x = 1, y = 1, s = 0;
                                                              static int max = 1e9;
                                                              for(x=1; x<=max; ++x, ++y) s += x/y;
                                                              return s;
                                                            }
                                                            
                                                            int main(){
                                                              clock_t t = mytime();
                                                              int s = count();
                                                              t = mytime() - t;
                                                              printf("Time: %gs.\ns = %d\n", (float)t/1000, s);
                                                            }


                                                            Конечно же, всё это надо оптимизировать, но это дело царей. Я не выжму из сишки меньше 5 секунд.
                                                            Ответить
                                                            • В моём случае v8 медленней сишки раз в 20, ибо я могу юзать авх"ы, треды, хипертрейдинг и прочее - питух v8 не может. Да и это примитивный пример, тут нечему тормазить, но даже тут v8 умудряется тормазит.

                                                              int main(void) {
                                                                double start_time = omp_get_wtime();
                                                                uint32_t x = 0, y = 0, res = 0;
                                                                while(++y, ++x < (uint32_t)1e9) res += (x/y);
                                                                fprintf(stderr, "%lf, %u\n", (omp_get_wtime() - start_time), res);
                                                              }

                                                              Собирай gcc -Ofast -march=native -m32 main.c -lgomp -funroll-loops -funroll-all-loops -fno-align-labels
                                                              Ответить
                                                              • > Как мне померить твоё гумно?
                                                                JScript.NET скорее всего в винде только доступен. По крайней мере, несколько месяцев назад в mono его не было.

                                                                > Собрал v8 - 3.5сек, я выпилил типы - ибо он ругался
                                                                Как всё серьёзно. Не надо было ради этого цикла так возиться.
                                                                JavaScript можно было и в Firefox запустить

                                                                > Собирай gcc -Ofast -march=native -m32 main.c -lgomp -funroll-loops -funroll-all-loops -fno-align-labels
                                                                Заинклюдил stdint.h, stdio.h, omp.h, иначе была питушня, вышли те же 5.1-5.2с.
                                                                Анроллинг защитан. С ним мой вариант с тем же int ускорился и отработал за 4.5-4.6.
                                                                Мой вариант с uint32_t работает 5.3с, следовательно царецикл с его 5.1 защитан (с int_32t - 4.50-4.52)

                                                                Пример примитивный я взял только ради деления, из-за которого в JS-подобных языках могут быть проблемы.
                                                                В JScript.NET я зафиксировал тип, но при делении числа преобразовывались туда-обратно.
                                                                V8 понял, что тип постоянен и из-за деления запилил плавающие числа. Кстати, мой вариант на сишке с float/double даёт 10.1с, как и хром.
                                                                Вот что с C# - не очень понятно.
                                                                А cscript гарантированно тормозит из-за интерпретации и выдаёт 230 секунд.

                                                                Надо будет посмотреть в сторону Asm.JS. Может, прокатит поделить два инта по-человечески.
                                                                Ответить
                                                                • >JavaScript можно было и в Firefox запустить
                                                                  Я не умею.
                                                                  #eix v8
                                                                  [i] dev-lang/v8
                                                                       Available versions:  (~)3.18.5.5(0/3.18.5.5) (~)3.18.5.8(0/3.18.5.8) 3.18.5.9(0/3.18.5.9) 3.18.5.14(0/3.18.5.14) (~)3.19.18.4(0/3.19.18.4) (~)3.19.18.9(0/3.19.18.9) [M](~)3.20.6(0/3.20.6) [M](~)3.20.8.2(0/3.20.8.2) [M]**9999 {icu neon readline}
                                                                       Installed versions:  3.19.18.9(17:59:08 11.08.2013)(readline -neon)
                                                                       Homepage:            http://code.google.com/p/v8
                                                                       Description:         Google's open source JavaScript engine

                                                                  Собирается 1минуту. Кстати, для питушков поясню: neon - это sse для арм, т.е. жабаскрипт тормазит на арм так, что потребовалось юзать неон. Пусть мне ещё покукарекают про переносимость жс и то, что я не могу юзать симды.

                                                                  >Кстати, мой вариант на сишке с float/double даёт 10.1с, как и хром.
                                                                  Флоаты, вернее конвейерное умножение/деление работает так же. Почему у тебя флоаты так тормазят - вопрос открытый и не ясный.
                                                                  Ответить
                                                • >Помню, был у меня лютый баттхёрт, когда узнал, что в Java надо создать хоть один класс, чтоб написать программу.

                                                  А что в этом такого?
                                                  Ответить
                                                  • > А что в этом такого?

                                                    Ну вот писал я на сишке и радовался, а тут взяли и навязали мне ООП. Даже, чтобы написать "hello, world", надо класс создать, хотя достаточно одной функции main. ООП ради ООП.
                                                    Ответить
                                                    • Он тебе щас скажет, что в серьёзном интерпрайзе - мейн, это серьёзный класс - который ты функцией не опишешь. А хелворды нужны для сишки, ибо на сишке только хелворд и можно написать, ко-ко-ко...
                                                      Ответить
                                                      • > Он тебе щас скажет, что в серьёзном интерпрайзе - мейн, это серьёзный класс - который ты функцией не опишешь.

                                                        Труъ ООПешник скажет, что не надо пихать всё в Main, надо стараться оставить там как можно меньше и предложит создать парочку-десяточек серьёзных классов.
                                                        Вон, примерно как в http://habrahabr.ru/company/abbyy/blog/173885/ делали.
                                                        Ответить
                                              • >Не, паскаль вообще не язык. В твоём жс так же много от паскаля, не меньше, чем от сишки. Но явное говнище, типа паскалевского фора, бегинов не попащили - видать не совсем идиотами были.

                                                Сишкаеб детектед.

                                                >ООП - высер идиотов, которые решили, что домохозяйки могут быть программистами

                                                А Си - язык королей?

                                                > Я ничего не имею против идей из которых сделали ООП - я ненавижу то говно, которое называют ООП, вернее ООП говного мозга. Юзать что-то это возможность, а не обязанность.

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

                                                  >А Си - язык королей?
                                                  Си - это единственный язык, который тебя нивчём не ограничивает. Я на нём могу писать всё, что угодно и как угодно. До гибкости Сишки, её простоты, компактности, быстроты и красоты - тебе, питушку, как до луны пешком - хотя это для тебя, заедушной макаки, не аргументы.

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

                                                  У тебя тотальное нарушение думательных процессов, всё криво в говно - вот до чего сишарпик доводит.

                                                  Никакое ООП не нужно пропацанам - пропацан итак знает и понимает всё. Он сам придумает себе и ООП, и хренопе. ООП нужно питушкам, как талмуд, в котором написанно "как нужно делать", причем это "как" не учитывает реальный мир вообще - учитываются лишь капиталистические ценности, аля быстрая взаимозаменяемость макак, низкий порог вхождение - делай по книнижульки и ставь кубики - насыщенность рынка, дешевая рабсила и взаимозаменяемость. Это то, для чего были придуманные жабы/сишарпики, да и ооп в частности.
                                                  Ответить
                                              • > В твоём жс так же много от паскаля, не меньше, чем от сишки.

                                                На словах ты Лев Толстой, а без пруфов ну-ты-понял. Жду список заимствований в ЖС из Паскаля.

                                                На мой же взгляд от Паскаля в ЖС ничего нет, ЖС скорее похож на Рапиру.
                                                Ответить
                                                • functopn, var, питушачьи эти как его - операции, да и тысячи другого говна.
                                                  Ответить
                                                  • С каких это пор в Паскале динамическая типизация? Variant — это костыль, такой же можно и в сишечке за несколько минут написать:
                                                    typedef struct {
                                                    int datatype;
                                                    int * datavalue;
                                                    } var;
                                                    Ответить
                                                    • >С каких это пор в Паскале динамическая типизация?
                                                      Это семантика, а семантики в паскале нет, ибо он говно.

                                                      >Variant — это костыль, такой же можно и в сишечке за несколько минут написать:
                                                      Питушок, иди подучи матчасть - в любом ПЯП это такой же кастыль.
                                                      Ответить
                                                      • Паскаль и сишечка наследуют семантику Алгола. Поэтому если у одного языка семантики нет, то по логике нет её и у другого.
                                                        Ответить
                                                        • Не наследуют. Как вы, питушки, меня одалели. Ты это в задрипанной книжечке прочитал? Иди возми сишку и возьми алгол, питушок - сравни. Да даже паскаль и Си сравни - ты видешь тут что-либо общее?


                                                          Запомни, питушок, то, что написанно в твоей говнокнижечке - этим ты можешь подтереться. О семантики сишки могут рассуждать только те, кто это сишку осилил. Осиливаешь сишку - идёшь и смотришь алгол, а потом уже кукарекаешь, повторю 10-й раз.


                                                          В очередной раз кто-то из питушков пробалаболился и понеслось. В паскале нет семантики, вменяемой семантики - его семантика такое говно, которое могут юзать лишь тотальные упорошки вроде вас с тарасом.
                                                          Ответить
                                          • >сначала ООП, потом код

                                            Логично. Сначала думай - потом делай.

                                            >ООПешники ничего не создают - они собирают кубики.

                                            И пока оопшники делают домики из кубиков, сишники плавят пластмассу

                                            Старый мир умирает с теми, кто не способен понять нового
                                            Ответить
                                            • >Логично. Сначала думай - потом делай.
                                              Реально? Какое же ты животной, уйди нахрен, питушок. Вот ты делаешь байду, и вместо того, чтобы подбирать материалы в зависимости от ситуации - будет мне как питух орать "я юзаю только говно - сначала думаю, потом делаю - зачем мне другие материалы - только говно".


                                              >И пока оопшники делают домики из кубиков, сишники плавят пластмассу
                                              Животное, я тебя солью в такое говно с твоим ООП. Разница в нашем скилле колоссальна, и пока ты, питушок, поднимаешь кубик - я создаю себе любой материал. Ты не путай сишника и себя, макаку с атроффированным мозгом.

                                              >Старый мир умирает с теми, кто не способен понять нового
                                              Глупый питушок, кукарекай - пока есть те, за счёт которых ты живёшь. Не станет их - ты поймёшь насколько ты бесполезен. Любая собиралка любит кукарекать, пока есть сишники, которые плавят им пластмассу и ваяют кубики, но по твоей же логике - они не нужны, что ты, говно, будешь делать без кубиков.


                                              Мне смешно смотреть на тебя, питушок. Ты не разу не видел вменяемых сишников и даже не представляешь что такое сишка - фу. Кукарекушка.
                                              Ответить
              • показать все, что скрыто3. Неявный профит
                Не думаю, что в данном примере это имело место, НО

                такая реализации позволяет подменить функцию округления внесением изменения в ОДНОМ месте. В целом, паттерн Strategy сила. В примере с финансовым калькулятором в п. 2 выше он был бы очень уместен.
                Ответить

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