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

    +113

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    //java.io.Bits
        static void putDouble(byte[] b, int off, double val) {
    	long j = Double.doubleToLongBits(val);
    	b[off + 7] = (byte) (j >>> 0);
    	b[off + 6] = (byte) (j >>> 8);
    	b[off + 5] = (byte) (j >>> 16);
    	b[off + 4] = (byte) (j >>> 24);
    	b[off + 3] = (byte) (j >>> 32);
    	b[off + 2] = (byte) (j >>> 40);
    	b[off + 1] = (byte) (j >>> 48);
    	b[off + 0] = (byte) (j >>> 56);
        }

    остальное содержимое класса в таком же стиле

    Запостил: 3.14159265, 21 Июня 2010

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

    • аффтар усвоил сдвиг влево, маладэц
      Ответить
      • кстати пару лет назад читал какой-то кривоватый класс для работы с датами в исходниках явы, написан в таком же стиле.
        смотрю а там аффтар то ли китаец то ли индус :D ))
        Ответить
        • а они трудолюбивые... им просто некуда трудолюбивость приложить, поэтому приходится выкручиваться :D
          Ответить
          • а ТРУъ программер наоборот должен быть ленивым ))
            то есть по возможности как можно меньше писать и переписывать, именно для этого придумали циклы, процедуры, ООП и прочее
            Ответить
            • вот именно... как можно более упростить и автоматизировать себе работу. из прочего - генераторы кода
              Ответить
              • бугага, нашел пример "оптимизации" сего класса
                http://cr.openjdk.java.net/~martin/webrevs/openjdk7/Bits.java/src/share/classes/java/io/Bits.java.cdiff.html
                Ответить
                • > Summary: Transformations to reduce size of bytecode

                  Вполне здраво. Это полезно для инлайнинга, например.
                  В чём там юмор-то?
                  Ответить
                  • Минусуют просто ни за что. Я ведь уйду с ресурса за такое отноешние.
                    Ответить
                  • позвольте спросить вы голосовали за этот ГК?
                    и если да то почему?
                    Ответить
                    • А что, я неправ насчёт инлайнинга? Джиттер инлайнит если код не очень большой (в моно это 20 опкодов) и не вызывает внешних методов. Ты бенчмарки проводил? То-то же. Оптимизации всегда как говнокод выглядят, на то они и оптимизации.

                      вот например было:

                      static int
                      linear (const int *arr, int n, int key) {
                              int i = 0;
                              while (i < n) {
                                      if (arr [i] >= key)
                                              break;
                                      ++i;
                              }
                              return i;
                      }


                      а стало:

                      static int
                      linear_sentinel_sse2_nobranch (const int *arr, int n, int key)  {
                              v4si *in_data = (v4si*)arr;
                              v4si key4 = { key, key, key, key };
                              int i = 0;
                              for (;;) {
                                      v4si cmp0 = __builtin_ia32_pcmpgtd128 (key4, in_data [i + 0]);
                                      v4si cmp1 = __builtin_ia32_pcmpgtd128 (key4, in_data [i + 1]);
                                      v4si cmp2 = __builtin_ia32_pcmpgtd128 (key4, in_data [i + 2]);
                                      v4si cmp3 = __builtin_ia32_pcmpgtd128 (key4, in_data [i + 3]);
                                      v8hi pack01 = __builtin_ia32_packssdw128 (cmp0, cmp1);
                                      v8hi pack23 = __builtin_ia32_packssdw128 (cmp2, cmp3);
                                      v16qi pack0123 = __builtin_ia32_packsswb128 (pack01, pack23);
                                      int res = __builtin_ia32_pmovmskb128 (pack0123);
                                      if (res != 0xffff)
                                              break;
                                      i += 4;
                              }
                              return i * 4 + __builtin_ctz (~res);
                      Ответить
                      • вы не ответили на мой вопрос а спороли какой-то оффтоп
                        ЗЫ и кстати мне похер, что вы минусуете все мои посты.
                        Ответить
                        • поясняю для Уебкиллов

                          до оптимизации
                          static void putLong(byte[] b, int off, long val) {
                          !         b[off + 7] = (byte) (val >>> 0);
                                    b[off + 6] = (byte) (val >>> 8);
                                    b[off + 5] = (byte) (val >>> 16);
                                    b[off + 4] = (byte) (val >>> 24);
                                    b[off + 3] = (byte) (val >>> 32);
                                    b[off + 2] = (byte) (val >>> 40);
                                    b[off + 1] = (byte) (val >>> 48);
                          !         b[off + 0] = (byte) (val >>> 56);
                                }
                            
                                static void putDouble(byte[] b, int off, double val) {
                          !         long j = Double.doubleToLongBits(val);
                          !         b[off + 7] = (byte) (j >>> 0);
                          !         b[off + 6] = (byte) (j >>> 8);
                          !         b[off + 5] = (byte) (j >>> 16);
                          !         b[off + 4] = (byte) (j >>> 24);
                          !         b[off + 3] = (byte) (j >>> 32);
                          !         b[off + 2] = (byte) (j >>> 40);
                          !         b[off + 1] = (byte) (j >>> 48);
                          !         b[off + 0] = (byte) (j >>> 56);

                          после оптимизации
                          static void putLong(byte[] b, int off, long val) {
                          !         b[off + 7] = (byte) (val       );
                                    b[off + 6] = (byte) (val >>>  8);
                                    b[off + 5] = (byte) (val >>> 16);
                                    b[off + 4] = (byte) (val >>> 24);
                                    b[off + 3] = (byte) (val >>> 32);
                                    b[off + 2] = (byte) (val >>> 40);
                                    b[off + 1] = (byte) (val >>> 48);
                          !         b[off    ] = (byte) (val >>> 56);
                                }
                            
                                static void putDouble(byte[] b, int off, double val) {
                          !         putLong(b, off, Double.doubleToLongBits(val));
                                }

                          да налицо умение использовать уже написанные функции
                          но до циклов мы еще не доросли, следующая оптмизация уже с циклом
                          ужмет код до 3-х строк, то есть каким он должен был написан изначально

                          и это нам выдадут за невъебенно солидную оптимизацию и серъезную работу кодеров ))

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

                            дебил, брэнчинг только замедляет ход, нафиг циклы?

                            насчёт убирания нулей - компиляторы разные могут быть, могут быть тупые, что реально добавят push 0; add
                            Ответить
                            • >>>нафиг циклы?
                              все с вами ясно
                              Ответить
                            • >>дебил, брэнчинг только замедляет ход
                              стоп!
                              мы боремся за уменьшение размера для инлайна или как?

                              будьте последовательным

                              тогда надо убрать вызов putLong - это ж в стек надо ложить а потом доставать - явное снижение скорости

                              завтра когда они напишут это циклом вы скажете что так и надо потому что инлайны бла бла бла

                              то есть если у вас 10 раз одно и тоже действие вы его так 10 раз и пишете из-за бренчинга?
                              Ответить
                              • кстати бренчинг не единственный фактор в процессоре там еще есть такая штука как Instruction Cache, которая при подобном
                                индусском подходе быстро забивается
                                Ответить
                              • > мы боремся за уменьшение размера для инлайна или как?

                                мы пытаемся балансировать между.

                                так или иначе, бессмысленный спор без конкретных бенчмарков
                                Ответить
                                • >>>так или иначе, бессмысленный спор без конкретных бенчмарков

                                  в принципе да

                                  но циклы однозначно выглдят красивее и писать их легче
                                  Ответить
                                  • .
                                    Ответить
                                    • читерские тесты
                                      1. в примере 8 итераций у вас 6

                                      вы б еще 2 итерации взяли и сказали что циклы отстой

                                      2. это си, а не ява
                                      3. в си тестят юзая rdtsc - так точно можно узнать что и как

                                      и эта проверьте как замедляет код вызов процедуры
                                      Ответить
                                  • void f1(char* bb)
                                    {
                                        bb[0] += 0;
                                        bb[1] += 2;
                                        bb[2] += 4;
                                        bb[3] += 6;
                                        bb[4] += 8;
                                        bb[5] += 10;
                                    }
                                    
                                    void f1(char* bb)
                                    {
                                        int i;
                                        for(i = 0; i < 6; i++)
                                        {
                                            bb[i] += i * 2;
                                        }
                                    }


                                    gcc -O3, 1 миллиард раз вызвав:

                                    развёрнуто 531 мс
                                    цикл 6172 мс
                                    Ответить
                                    • блин....
                                      вы русский язык понимаете?
                                      6 итераций != 8

                                      i * 2 - к чему это?
                                      умножение дольше сдвига
                                      прошлый тест был получше - количество итераций надо только было увеличить до 8 и использовать rdtsc
                                      Ответить
                                      • void f1(char* bb)
                                        {
                                            char i;
                                            for(i = 0; i < 8; i++)
                                            {
                                                bb[i] = i;
                                            }
                                        }
                                        
                                        void f2(char* bb)
                                        {
                                            bb[0] = 0;
                                            bb[1] = 1;
                                            bb[2] = 2;
                                            bb[3] = 3;
                                            bb[4] = 4;
                                            bb[5] = 5;
                                            bb[6] = 6;
                                            bb[7] = 7;
                                        }


                                        7734 мс -- цикл (f1)
                                        3437 мс -- развёрнуто (f2)

                                        но это именно что голое сравнение, если нам нужно решить задачу, то нам придётся высчиьываьб дополнительно аргумент сложения или сдвига, т.е. на практике-то дольше всё будет.
                                        Ответить
                                    • если поднять до 8, то результаты:

                                      развёрнуто - 1469
                                      цикл - 8891
                                      Ответить
                                      • это уже лучше, но вынужден прекратить дискуссию до тех пор пока не проведу свои тесты
                                        Ответить
                • > бугага, нашел пример "оптимизации" сего класса

                  у парниш нет фантазии
                  Ответить
    • показать все, что скрытоэто где?
      Ответить
    • показать все, что скрытоА что такое ">>>"? Это тройное закрытие тага?

      И в названии языка опечатка -- язык ведь javascript называется.
      Мы с Денисом Поповым применяли его на нашем принципиально новом веб-сайте.
      Правда что такое "byte[]" мне не понятно -- я таких квадратных скобочек еще не видел. Видимо эту программу я еще не знаю, но ничего -- выучу!
      Ответить
    • Сдается мне, что сделано это для большей читаемости. Ведь для тех кто использует битовые операции все это не является тайной. Сразу видно в какой бит что попадет.
      Ответить

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