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

    +66

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    Integer obj = (Integer)dump.get("size");
            if(obj == null) {
                return;
            }
            int size = obj;
            for(int i=0; i<size; i++) {

    Самое странное, что автор явно знает, что такое автобоксинг, но всё равно использовал его коряво.

    Запостил: lucidfox, 08 Сентября 2011

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

    • >Integer obj
      дальше не читал.это лютый пиздец.
      Ответить
    • А надо так:
      Integer dumpedSize = (Integer)dump.get("size");
      if (dumpedSize == null) return;
      for (int i = 0; i < dumpedSize.intValue(); i++) { //...
      ?
      Ответить
      • Не надо никакого intValue. Просто i < dumpedSize.
        Ответить
        • Не знаю, по-моему, не такое уж и говно. Избавился человек от вызова intValue() на каждой итерации. Название obj не очень, но не критично.
          Ответить
          • Если компилятор не безобразно туп, там не будет вызова intValue на каждой итерации. Проведу эксперимент.
            Ответить
            • Проведите. Насколько я знаю, компилятор java практически не делает оптимизаций. Этим заведует JIT, ему виднее, что реально нужно оптимизировать.
              Ответить
              • Ёлки-иголки, и правда.

                public static void main(String[] args) {
                		Integer count = 5;
                		
                		for (int i = 0; i < count; i++) {
                			System.out.println("i = " + i);
                		}
                	}


                превращается в...

                0  iconst_5
                     1  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [17]
                     4  astore_1 [count]
                     5  iconst_0
                     6  istore_2 [i]
                     7  goto 35
                    10  getstatic java.lang.System.out : java.io.PrintStream [23]
                    13  new java.lang.StringBuilder [29]
                    16  dup
                    17  ldc <String "i = "> [31]
                    19  invokespecial java.lang.StringBuilder(java.lang.String) [33]
                    22  iload_2 [i]
                    23  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [36]
                    26  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [40]
                    29  invokevirtual java.io.PrintStream.println(java.lang.String) : void [44]
                    32  iinc 2 1 [i]
                    35  iload_2 [i]
                    36  aload_1 [count]
                    37  invokevirtual java.lang.Integer.intValue() : int [49]
                    40  if_icmplt 10
                    43  return


                То есть действительно на каждой итерации.
                Ответить
                • Вот и я об этом. Возможно, ваш коллега не так уж и глуп, как кажется :)
                  Ответить
                  • Странная какая-то фигня получается.
                    Способ автора с использованием int медленнее способа с Integer на 200мс лично у меня.
                    Количество итераций 1000000000.
                    Ответить
                    • бенчмарк в студию
                      Ответить
                      • Дак там толком ничего нету.
                        Тело цикла заполняется однородным одинарным слоем говна не зависящего от типа аргументов в условии цикла.
                        for(int i=0;i<size;i++) - вариант с size типа int медленнее.
                        Ответить
                        • Возможны погрешности из-за нагрузки системы и т.п. Увидеть здесь разницу в производительности вряд ли удастся.
                          p.s. ХЗ, во что это превратит JIT :)
                          Ответить
                          • Нагрузки системы не было. Стабильная работа. Фоновые программы в ожидании данных и не более того. Вообще на меньшем количестве итераций все примерно одно и тоже, так что не шибко критично, посему хоть это и не ГК, но оптимизировать человеку, видимо, все таки захотелось :D
                            Ответить
                            • Все, я отказываюсь от каких либо заявлений. Результаты с одним и тем же типом начали отличаться чуть ли не на секунду.
                              Ответить
                              • Ммм, провел еще кучу тестов. Все встало на свои места. Теперь использование int вместо Integer быстрее на 250мс
                                Ответить
                          • JIT по идее должен заинлайнить вызов intValue, ведь это простой геттер, если посмотреть в исходники класса Integer. Но утверждать не берусь.
                            Ответить
    • Не говнокод. Явная оптимизация, чтобы "наверняка".
      Ответить
    • показать все, что скрытоvanished
      Ответить

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