1. Java / Говнокод #4099

    +121

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    if ((((o-'0')|('7'-o)) >= 0) && (((n-'0')|('3'-n)) >= 0)) {
                        return (n - '0') * 64 + (m - '0') * 8 + (o - '0');
                    }
                    unread();
                    return (n - '0') * 8 + (m - '0');
                }
                unread();
                return (n - '0');

    смайлоговнокод от Chen-Lieh Huang, Alan Liu
    /* @(#)Pattern.java 1.113 07/05/07
    http://kickjava.com/src/java/util/regex/Pattern.java.htm
    окончание серии #3976 #3975 #3940 #3998 #3999 #4007 #4054

    Запостил: 3.14159265, 25 Августа 2010

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

    • для тех кто еще сомневается в говености тех кодов и сего, нашел нормальную некитайскую Apache-имплементацию класса
      http://www.docjar.com/html/api/java/util/regex/Pattern.java.html

      ВНЕЗАПНО! @author Nikolay A. Kuznetsov - наш соотечественник

      1400 строк заместо 5600!!!
      и это при том что коментарии никуда не делись
      имеем over 4 раза сокращение объема 0_0!
      Ответить
      • >заместо
        избавь нас этого)
        Ответить
      • Не хочу сказать ничего плохого про нашего соотечественника, но не стоит забывать, что он использует дополнительные классы типа http://www.docjar.com/html/api/java/util/regex/Lexer.java.html (1300 строк) или http://www.docjar.com/html/api/java/util/regex/AbstractCharClass.java.html (830 строк) , которые добавляют коду объёма (и это только самые крупные). Люди же с азиатскими именами свои вспомогательные классы запихнули внутрь. Достаточно сравнить http://www.docjar.com/docs/api/java/util/regex/package-index.html и http://kickjava.com/src/java.util.regex.index.htm Так что ни о каком сокращении в 4 раза речи быть не может.
        Ответить
        • спасибо за указанную ошибку. я провтыкал. надо позырить как и что он там кодил.
          по крайней мере его имплементация при быстром просмотре мне понравилась больше.
          Ответить
    • я понимаю что говно и т.д. и т.п. но меня прикалывает кто их вот такому перлу научил:

      > ((o-'0')|('7'-o)) >= 0

      это в одно сравнение упаковано два сравнения ((o => '0') && (o <= '7')) что есть теоретически медленее, т.к. это два сравнения. (арифметику процы пайп-лайнят, а вот сравнения/джампы это всегда проблема).

      я бы за этот трюк в свои ассемблерые годы как минимум пива бы проставил.
      Ответить
      • что-то подсказывает мне, что компилятор может сгенерить соовсем не такой код (надо смотреть oopcodes).
        А уж как oopcodes выполнит на конкретном проце конкретная JVM -- отдельная тема
        Ответить
        • В С, если аргумент есть знаковое число, после побитового OR оно останется знаковым и в С сравнение с нулем будет работать как и ожидается.

          За жабу не скажу, не знаю.
          Ответить
      • кстати таким же образом можно оптимайзить дальше
        ((((o-'0')|('7'-o)) >= 0) && (((n-'0')|('3'-n)) >= 0))
        в
        ((o-'0')|('7'-o) | (n-'0')|('3'-n))>=0
        это почему-то не сделано - наверняка скопипейздили откуда-то
        по ходу класса и по этому куску в частности видно, что о сдвигах и битовых операциях авторы вообще не в курсе
        Ответить

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