1. Си / Говнокод #3376

    +103

    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
    /*    Copyright 2009 10gen Inc.
     *
     *    Licensed under the Apache License, Version 2.0 (the "License");
     *    you may not use this file except in compliance with the License.
     *    You may obtain a copy of the License at
     *
     *    http://www.apache.org/licenses/LICENSE-2.0
     *
     *    Unless required by applicable law or agreed to in writing, software
     *    distributed under the License is distributed on an "AS IS" BASIS,
     *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     *    See the License for the specific language governing permissions and
     *    limitations under the License.
     */
    
    /* all the numbers that fit in a 4 byte string */
    const char bson_numstrs[1000][4] = {
        "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",  "8",  "9",
        "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
    	/* 105 строк поскипано */
        "980", "981", "982", "983", "984", "985", "986", "987", "988", "989",
        "990", "991", "992", "993", "994", "995", "996", "997", "998", "999",
    };

    Взято отсюда - http://github.com/mongodb/mongo-c-driver/blob/master/src/numbers.c . А это коммит - http://github.com/mongodb/mongo-c-driver/commit/0198225180a51e0b0b8a84f25b34b3047d3b9c80

    Запостил: raorn, 02 Июня 2010

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

    • Неиллюзорнейшим образом доставляет функция:

      void bson_numstr(char* str, int i){
          if(i < 1000)
              memcpy(str, bson_numstrs[i], 4);
          else
              sprintf(str,"%d", i);
      }
      Ответить
      • Это, похоже, некоторая оптимизация. А стоит она того или нет могут показать только измерения. Может и стоит.
        Ответить
        • Дак а смысл массив этот руками фигачить? Заполнить циклом при запуске, делов-то...
          Ответить
          • Для этого цикла могла быть написана другая специальная программа (программа хэлпер), которая выводит этот код.
            Ответить
            • Ну могла быть. Почему нет... Я просто не вижу особых преимуществ в вынесении заполнения массива на этап компиляции
              Ответить
              • Может преимущество в том, что код этот не мешается под глазами.
                Ответить
        • Автор считает, что
          sprintf sucks. use lookup table for all nums < 1000
          Ответить
          • > Автор считает, что
            > sprintf sucks

            так и есть, он медленный. вот мой велосипед:

            cfchar* __cfint_ToWBuffer(cfint n, cfchar* buf, cfuint* out_count)
            {
                wchar_t* ptr = buf + 15;
            
                cfbool neg = (n < 0);
                if(neg)
                    n = -n;
            
                *ptr-- = 0;
            
               again:
                {
                    *ptr-- = (n % 10) + '0';
                    n /= 10;
                }
                if(n)
                    goto again;
            
                if(neg)
                    *ptr-- = '-';
            
                ++ptr;
                if(out_count)
                    *out_count = 15 - (cfuint)(ptr - buf);
            
               return ptr;
            }
            
            cfString* cfint_ToString(cfint n)
            {
                cfchar buf[16];
                cfuint count;
            
                cfchar* ptr = __cfint_ToWBuffer(n, buf, &count);
            
                cfString* str = cfString_CreateBuffer(count);
                wcscpy(&str->m_fstChar, ptr);
            
                return str;
            }
            Ответить
            • и как?? сколько выигрыш??

              эту строку на главную
              wchar_t* ptr = buf + 15;
              в данном контексте она займет достойное место среди самого отменного говнокода...
              Ответить
              • > wchar_t* ptr = buf + 15;
                в данном контексте она займет достойное место среди самого отменного говнокода...

                обоснуй.
                Ответить
                • а откуда понятно что buf + 15 это все еще buf? может это адрес возврата? а может стек какой функции? может соседний массив?
                  Ответить
                  • дебилка, __cfint_ToWBuffer вызывается только из cfint_ToString, это не открытая функция. оставлено нестатическим чтобы вызываться из пары других мест (как internal-метод), буфер _должен быть_ 16 чаров. оттуда и понятно.

                    капча 6666 подтверждает
                    Ответить
                    • от этого меньшим говнокодом оно не стало... сегодня internal, а завтра такой же оптимизатор решит, что для его числа хватит 4 байт с головой...
                      некрасиво отмазки под гостем лепить...
                      Ответить
                      • > что для его числа хватит 4 байт с головой

                        не понял
                        Ответить
                        • если нашнлся человек который считает что гото с условием быстрее чем цикл (который там умеснее), то найдется человек у которого для чисел до 1000 хватит 4 символов...
                          Ответить
                          • > то найдется человек у которого для чисел до 1000 хватит 4 символов...

                            я опять тебя не понял. что за хуйню ты порешь?
                            Ответить
                          • ты хочешь сказать что кто-то буфер размером в 4 байта подставит в функцию? это запрещено в мане функции, это определённый баг будет.
                            Ответить
                            • а в коде не запрещено... пересчитай на пальцах всех кто читает маны... хотябы ассертом перекрыл...
                              Ответить
                              • блядь ты пиздец хуила.
                                ассерты в не публичных функциях - для лосей типа с++ников или пхпистов.
                                написано - только 16 байтов, значит столько. если какое другое число - то ты говнокодер, трепло и хуйло, а не программист, выеби себя в жопу и сдохни.
                                Ответить
                                • я тебе сказал что если нашелся умник который нашел профит от goto, то обязательно найдется умник которому для чесел до 1000 будет достаточно 4 байтного буфера, алгоритм этой ошибки никак не отлавливает... он просто затрет кусок данных по соседству, отловить это очень сложно...
                                  документацию никто никогда не читает, если у кого-то возникает задача то он спросит о коллег и те расскажут что видели такую функцию, человек ее использует (интелисенс еще и подскажет что подсовывать) у него получается, он радуется, рапортует о завершении своего таска и тут начинаются никому непонятные глюки...
                                  Ответить
                                  • > документацию никто никогда не читает

                                    ну всё понятно, ты бы так сразу и сказал, что ты тупая обезьянка из быдлоконторы.

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

                                        это страхи быдлообезьянки среднего звена - лёгкая заменяемость одной на другую. у меня такого страха нет. А знаешь почему? )
                                        Ответить
                                        • я хочу чтоб код который я оставлю, оставил обо мне только хорошие впечатления...
                                          тебя же не уволят, из-за того что в этом говне можешь ковыряться только ты...
                                          Ответить
                                  • > человек ее использует (интелисенс еще и подскажет что подсовывать)

                                    > человек ее использует (интелисенс еще и подскажет что подсовывать)

                                    уахаха, это вы в своей конторке ТАК пишете код? да ты ещё забавнее, чем я думал.
                                    Ответить
                                    • код должен сам ловить ошибки... потому как ошибиться может случайно даже автор спустя полгода после написания... начальнику пойди расскажи что большую часть времени ты и твои коллеги читают документацию, там где можно спокойно обойтись без этого...
                                      Ответить
                                • у ПХПистов есть ассерт? а у шарпистов есть ассерт? а у явистов?
                                  Ответить
                                  • просто блядь, когда знаешь, что делаешь - ассерты не нужны.
                                    все эти ассерты они по незнанию, неуверенности, отсутствию внимания и ума. т.е. как раз для с++ников и шарпистов всяких, которые уже садятся писать код, не имея никакого представления, с какой библиотекой работают. и это их не спасает, и всё роавно у них постоянно всё падает.
                                    Ответить
                                    • ассерты всегда нужны... это первый шаг к отсутствию говнокода... с ними проще искать ошибки... но если у тебя ЧСВ высоко настолько что ты не допускаешь ошибок, то можешь смело просить свое начальство уволить тебя, так как ты - это дыра в бюджете...
                                      код должен сам искать в себе ошибки, и именно такой код экономически эффективен...
                                      Ответить
                                      • > код должен сам искать в себе ошибки, и именно такой код экономически эффективен...

                                        пиздец, я тебе уже 20-ый повторю, наверное... в дельфи есть такое понятие, как nested-функции. твоя тупая головушка, надеюсь згнает, что это? так вот, __cfint_ToWBuffer - это nested-функция функции cfint_ToString. С какого хуя я должен тыщу раз перепроверять данные внутри одной (над)функции? я же не какой-нибудь ебанутый на всю голову с++ник.
                                        Ответить
                                      • > ассерты всегда нужны... это первый шаг к отсутствию говнокода

                                        ты неправ очень сильно. говнокод пишется говнокодерами. ассерты - шаг не к отсутствию говнокода, а шаг к сдерживанию говнокодеров (fool-proof code).
                                        вместо того, чтобы сдерживать говнокодеров, лучше бы их просто не допускать за милю.
                                        что касается ошибок по невниманию - то они случаются у жалких людишек всегда, в независимости от сдерживающих мер, которые, например, сами могут быть говнокодом, например, давеча в одной игрушке в одной локации происходил креш... с ассертом. Уже в продакшене. Стало быть, сдерживающие меры тоже нужно защищать? А сдерживающие меры сдерживающих мер? И так до бесконечности? А не проще ли тупо всё семь раз перепроверить? А? Глупые обезьяны.
                                        Ответить
                                        • во первых недопускать невозможно... так как неясно кто пишет говнокод, а кто его не пишет... так как у говнокода довольно расплывчатое понятие... а вот у ошибок все ясно, либо они есть, и код мне покажет где и в чем, либо их нет и код будет молчать...
                                          прежде чем запретить говнокодерам писать говнокод, спроси себя, а не гавно, ли твой код... и всегда найдется тот кто скажет и докажет что говно...
                                          Ответить
                                      • слушай, я не против рантайм-проверки аргументов _публичных_ функций, ибо неизвестно, кто ими будет пользоваться.
                                        я против проверок на каждом шагу, против паранойи.
                                        конвенция уменя такая, что _публичные_ функции обязательно проверяют аргументы функций на валидность, кидается исключение обязательное.
                                        но _вспомогательные_, _приватные_ функции могут без этого обходиться, ибо контекст использования кристально ясен (иначе какого хуя ты трогаешь код функции?). зачастую. иногда конечно бывает что и у аргументы приватных функций надо валидировать.
                                        Ответить
                                        • этой паранои не будет в релизе... еще ни одному проекту не помешали лишние перестраховки в дебаге...
                                          Ответить
                                      • 4. Debuggers. We've got debuggers, one we support and one we use.
                                        You shouldn't make mistakes anyway, it is a waste of time. We
                                        don't want to hear anything about debuggers, we're not interested.
                                        See figure 1.
                                        Ответить
                                        • и я о том же... искать баги отладчиком намного дороже...
                                          Ответить
                                    • к стати глядя на твой код, и чрезмерно завышенное ЧСВ, тебе еще многому стоит научиться... когда нормальному программисту говоришь что его код говно, он начинает решать проблему говна, а не проблему поиска говна у других и оправдания себя...
                                      Ответить
                                      • > когда нормальному программисту говоришь что его код говно, он начинает решать проблему говна

                                        в том-то и дело, что здесь нет ни говна, ни проблемы, а аргументы ты как настоящий пришибленный фанатик "неговна" игнорируешь. и как с++ников после этого уважать?
                                        Ответить
                                        • единственный аргумент. это то что гото ты оставил по невнимательности...
                                          вот цитата из поста ниже:
                                          > на гото, которое я случайно оставил в коде
                                          человеку свойственно ошибаться, но некоторые люди перестраховываются... ассерт - один из методов подстраховки...
                                          Ответить
                                  • у явистов есть. И в спецификации так и написано "only pidarases use asserts in public functions"
                                    Ответить
                                    • нуну... а че под анонимусом? боишься что начальник прочитает? асеерты расставляются за минуты, а экономят часы работы в отладчике...
                                      Ответить
                                      • > сеерты расставляются за минуты, а экономят часы работы в отладчике...

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

                                            ну да, хелловорлды тока и пишу.

                                            > очень много времени

                                            не, я просто не умею страдать хуйнёй - кодю постоянно. аутист как бы...

                                            > и очень высокое ЧСВ...

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

                                            у тебя вот текущий проект сколько ЦЛОК?
                                            Ответить
              • я вообще-то какбэ хотел показать, что перевод числа в строковое значение без спринтфов - тривиальная задача в три строки, а автор городит массив из 1000 значений. __cfint_ToWBuffer это как бы nested-функция функции cfint_ToString, поэтому я там особо не заморачивался насчёт красивости кода + поскипал комментарии, которые всё объясняют.

                у меня ещё есть обратная функция, работает быстрее atoi.
                Ответить
              • тупой мудачок,

                1) эта функция - реплика классического примера из Kernighan и Ritchie's The C Programming Language, только там два старых мудня хуячат вперёд по массиву, а потом по всему массиву делают reverse, а у меня сразу хуячится в обратном порядке.

                2) на гото, которое я случайно оставил в коде, ты обратил внимание (на это способен последний пхпшник), а на то, что функция неправильно работает с -2147483648, ты не заметил.

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

                    лось,

                    1) ты можешь уже понять, что __cfint_ToWBuffer используется ещё в паре других мест, где копирования нет

                    2) ты можешь уже понять, что я работаю с wchar_t'ами, ты мне предлагаешь копировать wchar_t-буфер в char-буфер, применять sprintf/непортабельный itoa (которые хуй знает сколько ещё раз чего копируют), а затем снова копировать char-буфер в wchar_t-буфер?

                    Да ты просто олигофрен.
                    Ответить
                    • почему же не запостил то где есть профит? это ведь стандартный алгоритм K&R только while заменен на goto, и порядок обратный, но в этом случае оно не даст профита...
                      Ответить
                      • ради тебя,

                        TOP8 (под виндой с gnu stdlib)

                        8,1 сек -- __cfint_ToWBuffer/-O3
                        16,4 сек -- _wtoi (у которого мегатраблы с портабельностью)
                        16,7 сек -- нечестный itoa (у которого траблы с портабельностью), только char
                        17,7 сек -- __cfint_ToWBuffer/-O1
                        22,2 сек -- честный itoa (у которого траблы с портабельностью), с конв. char > wchar_t
                        52,4 сек -- wsprintf (у которого траблы с портабельностью)
                        64,5 сек -- нечестный sprintf, только ебаный char.
                        69,5 сек -- sprintf с конвертированием charbuf'а в нужный wcharbuf
                        Ответить
                        • вместо _wtoi читать _itow :)
                          Ответить
                        • тестить надо твою функцию в паре с strcpy. так как остальные заполняют буфер от начала...
                          Ответить
                          • > так как остальные заполняют буфер от начала...

                            как разница, блядь? и там, и там возвращается указатель на нлуь-терминированную широку строку. остальное - не ебёт.
                            бля долго объяснять, короче с тем как у меня реализованы строки, такой подход имеет меньший оверхед, чем с встроенными функциями (половина из которых непортабельна)

                            со встроенными функциями я буду иметь оверхед в двойной strcpy, а со своей функцией я имею только один strcpy.

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

                            на сим иди на хуй.
                            Ответить
                          • добавил wcscpy(buff2, buff);

                            теперь 9,3 сек.

                            что ещё придумаешь? что я ещё должен добавить?
                            Ответить
                            • это я и хотел увидеть... теперь ты крут... +9000 к ЧСВ...
                              (но код лучше поправить, чтоб потомки тебя говном не поливали на весь интернет)
                              Ответить
                              • > это я и хотел увидеть... теперь ты крут... +9000 к ЧСВ...

                                хаха, слив защитан )

                                > (но код лучше поправить, чтоб потомки тебя говном не поливали на весь интернет)

                                говна здесь нет. точка. я уже устал тебе просто объяснять, что к чему.
                                Ответить
                                • у каждого свои понятия ковнокода, по моим понятиям это говнокод... запости на главной...
                                  Ответить
                  • слушай, помоги пожалуйста, скажи, как сделать так, чтобы функция с min_value нормально работала? не знаю, что делать!!11
                    Ответить
                    • проверь на min_value и выдай заранее подготовленный буфер с данными...
                      Ответить
                  • ок, давай объясни, в чём говнистость, и я перестану тебя считать говнокодером, треплом и хуйлом.

                    велосипед? соглашусь.
                    говно? нет.
                    Ответить
                    • показать все, что скрытода пожалуста...

                      1) богомерзкий гото
                      2) запись в буфер без проверки (самый главный пункт)
                      3) практически при любых раскладах после этой функции должно идти что-то подобное strcpy (хочу пример где я не прав)... а это копирование которое можно было спрятать либо внутрь функции, либо построить алгоритм так чтоб буфер заполнялся от начала (чтоб можно было дописывать данные в конец строки, передавая в функцию именно ее конец а не буфер + strcpy)...
                      в С++ это можно было бы сделать отличным шаблоном и кроме профита получить большую универсальность...
                      Ответить
                      • 1) фанатизм
                        2) я устал повторять, что это nested-функция, она не открытая, буфер _должен быть_ 16 чаров по определению; ассерты - для олигофренов
                        3) с++ не могу юзать.
                        Ответить
                        • хорошо, отмазки засчитаны...
                          надеюсь что ты понял что писать нормальный и легко поддерживаемый код проще чем придумывать отмазки...
                          Ответить
                          • > надеюсь что ты понял что писать нормальный и легко поддерживаемый код проще чем придумывать отмазки..

                            нет, не понял. я не тусуюсь с тебе подобными (парнями, которые начинают писать код (или пытаться "критиковать" его), не разобравшись сперва что к чему) :)
                            Ответить
                            • > я не тусуюсь с тебе подобными

                              поэтому никакие отмазки придумывать не надо :)
                              Ответить
                            • поэтому тебе пофиг на твой код...
                              Ответить
            • запости этот алго на главную... уверен он наберет отличный рейтинг...
              Ответить
            • Надеюсь, это такой тонкий стёб.

              P.S. А чем Вам do { ... } while ( n ); не угодил? Почему метка?
              Ответить
              • потому что goto быстрее while'а в моих тестах
                Ответить
                • серьезно? выложите ка результаты... сколько там разницы, 1%?
                  Ответить
                  • не помню, но разница была.
                    на читаемость ну никак не влияет.
                    Ответить
                    • если и была то на уровне погрешности... не С#/Java ведь...
                      Ответить
                      • Вы издевайетесь чтоли?
                        Еще в 1971 г Дейкстра открыл, что метки юзают два вида людей: программисты на асме и дегенераты.
                        Ответить
                        • так как ассемблера я тут не вижу, выбор невелик...
                          Ответить
                    • А если велоцираптор сожрёт?
                      Ответить
                • Ну, допустим, быстрее. Какой выигрыш в производительности будет на фоне деления и взятия остатка от деления? Я сильно сомневаюсь, что больше 5%. А ради 5% размениваться на подобные изыски... Можно, конечно, но для этого нужно иметь веские основания.
                  Ответить
                  • пистец, парень. спринтф тормозит, я сделал более быструю версию.
                    потом тестировал, баловался, и оказалось, что по метке быстрее, чем циклом. ты мне скажи: кому от этого плохо, блядь? одно дело когда цикл такой закардкоженный с хуевой тучей переменных, что блядь пиздануться. другое дело - когда в одном месте и всё абсолютно читаемо.
                    вы блядь узколобые фанатики заебали уже. иди на хуй.
                    Ответить
                    • Спасибо за развернутый ответ.

                      P.S. Как хорошо, что я никогда не умел пользоваться метками.
                      Ответить
                      • > P.S. Как хорошо, что я никогда не умел пользоваться метками.

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

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

                                неправильный вывод. с твоей недоаргументации - гото здесь _не имеет преимуществ_, а не _бессмысленен_. так же как не имеет особых преимуществ тут и while. поэтому особой разницы что юзать - тут нет, а ты прикапываешься как просроченная хуилка. да и в этом конкретном примере узреть "спагетти", за которые ругают готосы, может только олигофрен, которому поднять взор на две строки вверх составляет мучительное логическое приключение.

                                это прямо пиздец, спорить из-за такой мелочи. что ещё предложишь, может поспорим, чо круче: сишарп или с++? вот пиздец достойное студентоты занятье. только без меня, ок?
                                Ответить
                    • на сколько процентов спринтф медленнее вашей функции? а во сколько раз удобнее?
                      почему не atoi или _atoi?
                      код говно чуть более чем полностью и это факт!
                      Ответить
                      • сори itoa или _itoa для свежих компиляторов...
                        Ответить
                      • > на сколько процентов спринтф медленнее вашей функции?

                        дело было давно, но спринтф был медленнее на порядок

                        > а во сколько раз удобнее?

                        в смысле удобнее? __cfint_ToWBuffer не публичная функция, сколько раз повторять. "удобной" тут является cfint_ToString, которая органично входит в фреймворк.

                        > почему не atoi или _atoi?

                        вроде тоже тормознее + не везде есть.
                        Ответить
                      • > почему не atoi или _atoi?

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

                      фига се))) а я свой 4.77 Mhz давно уже выкинул. Не думал, что под него реально еще пишут.
                      Ответить
                      • ещё одна тупая хуилка. прочитай пост выше, я так-то гото оставил случайно.
                        а спринтф тормозит - и всё тут.
                        я конечно знаю что пхпшники типа тебя ничего сложнее хелловорлда не писали, но для числословомолотилки это всё важно.
                        Ответить
                  • Я не понимаю проблемы. Любой программист вынужден выбирать между:
                    1.) читабельностью для человека
                    2.) читабельностью для компьютера, aka оптимальностью
                    3.) качеством кода
                    4.) скоростью написания кода

                    Я лично для функций такого назначения расставляю приоритеты: 3, 2, 4, 1... Можно согласиться, что использование goto в данной функции - это моветон, но не более. И я тоже согласен, что sprintf тормозной до жутиков. И так же я согласен с мыслью, что если делать вилосипед, то как можно оптимальнее (иначе зачем он нужен?). Придираетесь к фигне какой-то, честное слово.

                    С другой стороны, мне кажется странным, что goto ускоряет данный процесс. Единственное что я могу придумать, что компилятор как-то криво работает с выравниванием. Возможно надо было провести тест на нескольких системах. Однако если тест показывает, что по какой-то причине goto быстрее, то IMHO, на этом диалог на тему goto должен быть закончен.
                    Ответить
                    • В большинстве случаев гоуту мешает оптимизации компилятором. Проверено на многих тру компилирах.
                      Ответить
                      • Вот! Это уже здравый аргумент. Вот именно такими словами надо обосновывать свою позицию, почему там нельзя использовать goto. Но этот аргумент надо подтвердить фактом, например взять этот код с goto и без откомпилить с "-O2" и проверить что быстрее. Мне тоже кажется странным, что goto мог показать более приятный результат, однако признаю я только строго научный подход.

                        Я то выступаю против позиции, обзывать что-либо говнокодом, а что ещё хуже очень некрасиво обзывать других людей из чисто "религиозных" соображений. Всё надо аргументировать, а аргументы по возможности подтверждать фактами.
                        Ответить
                    • забыли дописать
                      5 ) удобство использования.
                      Ответить
                      • Пришёл Пушкофф,
                        Разбигайся тролль,
                        Наломает дрофф,
                        Все почувствуют болль.
                        Ответить
                      • ты кодом подтираешься или как? Удобно используется?
                        Ответить
                      • никак всея король говнокода к нам пожаловал
                        как там с++ твой поживает?
                        дрочишь потихоньку?
                        Ответить
                      • а я видел вас, кароль с++, на www.GameDev.ru
                        вы ещё не думали поспорить на тему с++ VS Delphi с TarasB?
                        TarasB тоже временами на www.GameDev.ru появляется, но он кароль Delphi
                        Наверное это вайна?
                        Ответить
                        • с ним нет смысла спорить, он адекватен...
                          ну и по поводу делфи на ГД.ру не спорят уже несколько лет...
                          Ответить
                        • я, к стати, не считаю себя королем С++... да и те кто зашипил игры покруче чем я, тоже не считают себя королями...
                          Ответить
                        • Ой, меня на Геймдеве запалили!!! Ой вей, шо делать...
                          Если гото тут быстрее, чем нормальный цикл, то попробуй другой компилятор, это ненормально.
                          Ответить
                          • Ой вей, на геймдеве сидят тру кулхацкеры)))))
                            Ответить
                            • Да нет, что ты, какой из меня кулхаркер, я же пишу на саксовой дельфе...
                              Ответить
                              • вот-вот, отвернись к стеночке и помалчивай, пока взрослые дяди беседуют
                                Ответить
                    • У меня нет претензий к идее алгоритма, но реализация алгоритма мне не по душе:
                      1) Использование магического числа 15;
                      2) wchar_t *ptr вместо cfchar *ptr;
                      3) Использование безусловного перехода;
                      4) Проблемы с INT_MIN.

                      И я не вижу проблемы в том, чтобы пофиксить эти моменты:
                      1) и 2) - проблем ноль.
                      3) - гест утверждает, что goto быстрее (хотя бенчи все-таки не привел). Раз код никто, кроме автора, не использует, то и фикс на усмотрение автора.
                      4) - как уже говорили, загодя подготовленный буфер.
                      Ответить
                      • > Использование магического числа 15;

                        ну давайте заведём константу BUFFER_SIZE_FOR_INT_TO_STRING_CONVERSION , и вместо 15 будем юзать BUFFER_SIZE_FOR_INT_TO_STRING_CONVERSION - 1. Всем сразу полегчает.

                        > wchar_t *ptr вместо cfchar *ptr;

                        cfchar это тайпдеф к wchar_t

                        > Использование безусловного перехода;

                        Где?

                        > Проблемы с INT_MIN.

                        Ага, я уже упомянул :*
                        Ответить
                        • > ну давайте заведём константу
                          Ты правильно уловил идею.
                          > cfchar это тайпдеф к wchar_t
                          Правда? А я и не догадывался. Зачем же этот typedef делали, если все равно wchar_t используют, а?
                          > Где [безусловный переход]?
                          Это я так goto обзываю, ага.
                          > Ага, я уже упомянул :*
                          Молодец. Возьми пирожок на полке.

                          Все твои аргументы ничтожны. Будь мужчиной, признай это. =D
                          Ответить
                          • > Ты правильно уловил идею.

                            Ну без тебя бы я не понял какбэ.

                            > Правда? А я и не догадывался. Зачем же этот typedef делали, если все равно wchar_t используют, а?

                            Случайно затесался. Все умерли, занавес.

                            > Это я так goto обзываю, ага.

                            Если гото идёт после ифа, то это как-то странно его называть безусловным.

                            > Все твои аргументы ничтожны

                            Какие аргументы?

                            > Будь мужчиной

                            сказал 11-классник UncleALI?
                            Ответить
                            • > сказал 11-классник UncleALI?
                              9-класснику cfdev ))
                              Ответить
                              • как узнал?!!
                                Ответить
                                • cfchar
                                  Ответить
                                • ты спалился
                                  твой код за версту виден
                                  Ответить
                                  • своей изящностью и неоригинальным подходом? да ведь?
                                    Ответить
                                    • > неоригинальным

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

                                          ну почему, почему я лучше всех?..
                                          Ответить
                                • по почерку. ))
                                  Ответить
                              • я так-то в десятом должен быть по возрасту!!
                                Ответить
                            • > как-то странно его называть безусловным
                              Не я один считаю, что это "оператор безусловного перехода" (http://ru.wikipedia.org/wiki/GOTO, первое предложение). Но это нюанс, замечание принимается.
                              >> Будь мужчиной
                              > сказал 11-классник UncleALI?
                              Странный наезд. Ты считаешь, что школьник не может быть мужчиной?
                              Ответить
                              • > Не я один считаю, что это "оператор безусловного перехода"

                                ну это буквализм.

                                > Странный наезд. Ты считаешь, что школьник не может быть мужчиной?

                                ну так люди мужиками становятся годам минимум к 25.
                                Ответить
                                • >ну так люди мужиками становятся годам минимум к 25.

                                  Ну ты петушок... Я уже им стал в 15.
                                  Ответить
                                  • ну в понимании пацана мужиком становишься это когда бабу того типа да?
                                    в моём понимании мужик это взрослый человек, могущий трезво мыслить. хуй совать направо-налево всякая макака может. так вот, формируется мораль пацанчик к 25 минимум окончательно. вот тольког тогда он мужик. а до того - сявка малолетняя.
                                    Ответить
                                    • Ты девушка? Откуда столько про мужиков знаешь?
                                      Ответить
                                • > ну так люди мужиками становятся годам минимум к 25.
                                  Ну это в каком-то смысле верно. Только некоторые и в 25 остаются пацанами. Когда я говорил "мужчина", я имел в виду "парень, способный трезво оценивать ситуацию, признавать свои ошибки и отвечать за свои слова". Как-то так.
                                  К тому же, я применил это понятие во фразе, которую можно считать идиомой, по типу "Будь честен с самим собою - [...]". Так что ничего личного.
                                  Ответить
                                  • > ну так люди мужиками становятся годам минимум к 25.

                                    Даже женьщины?
                                    Ответить
                          • > ну давайте заведём константу
                            > Ты правильно уловил идею.

                            эта константа (BUFFER_SIZE_FOR_INT_TO_STRING_CONVERSIO N) используется причём буквально в одном месте. ты просто сказочный архитектор.
                            Ответить
                            • какая разница сколько раз она используется... магические числа есть - зло...
                              Ответить
                              • блядь, число, очевидное из контекста функции, - магичекское только для кретина. грубо говоря, молния бьёт в дерево - для крестьянина это чудо, магия. а для физика очевидность. вот ты такой же тупой крестьянин.
                                Ответить
                                • уже не смешно... я описал ситуации в которых код будет тупо крешить нивчем неповинные данные, но ты как упоротый крестьянин доказываешь (причем от лика анонимоуса) что заранее написал кусок говнокода, который используется из другого куска говнокода...
                                  я конечно понимаю, что проболжать стебаться над куском твоего говна очень весело, и еще веселее видеть твою реакцию на эти издевательста...
                                  поэтому я скажу еще раз, когда твой однокласник решит сэкономить 8 байт и на 0,005% ускорить выполнение программы, потом вы будете полгода вместе искать ошибки которые будут лезть изо всех дыр (а уверен что такого говна у вас в коде навалом, асертами то вы не пользуетесь, так как умеете проверять все 7 раз), остальные твои однокласники будут смотреть на вас и думать что С говно, потому что рождает никому неведомые проблемы с памятью, а еще хип у него медленный, потому что им заткнута каждая дырка в коде...
                                  Ответить
                                  • Да он тролит тебя. Забей.
                                    Ответить
                                  • > поэтому я скажу еще раз, когда твой однокласник решит сэкономить 8 байт и на 0,005% ускорить выполнение программы, потом вы будете полгода вместе искать ошибки

                                    т.е. ты предлагаешь изменить сигнатуру функции на:

                                    cfchar* __cfint_ToWBuffer(cfint n, cfchar* buf, cfuint char_count, cfuint* out_count)

                                    Так? Учитывая, что размер должен быть по определению 16, третий аргумент всегда должен быть 16, а в теле функции (которая на деле является частью другой) будем ассертить - точно ли 16????. В чём профит? Или лучше будет не количество чаров, а количество байт? Тогда можно будет с чистой совестью писать sizeof(buff) и считать себя кулхацкером. Тогда мы введём кучу ненужного говна, типа проверки кратен ли bufsize значению sizeof(wchar_t) (ибо варьируется на разных платформах, если ты не знал), деления на него же (чтобы высчитать количество вайдчаров) и т. д. и т. п. Нахуй вводить эти ненужные, лишние сущности, лишь бы вот чтобы две соседствующие, взаимозависимые функции не делили один семантически общий buf[16]? (16 = 12 чаров на число + 4 на быдловыравнивание). Все эти функции маленькие, соседствуют друг с другом, видимы в пределах одного листа, являются подчастями друг друга (выделено в отдельную функцию, чтобы не дублировать код в паре мест). И ты меня всё равно не убедил, нахуй тут нужно ассертить. Мне это напоминает bool b; if(b == true) {

                                    > а уверен что такого говна у вас в коде навалом

                                    valgrind + тесты не выявляют ничего. Всё воркает. А у тебя поди падает через раз с ассертами твоими. И в отладчике часами ищешь, ха-ха. Глупая макака ты, а не программист.

                                    > и еще веселее видеть твою реакцию на эти издевательста...

                                    ха-ха...
                                    Ответить
                                    • да, ты правильно понял...
                                      количество элементов нужно передавать как sizeof(buf)/sizeof(buf[0]) - выражение вычисляется в компайл тайме... твоим однокласникам при попытке подсунуть левые данные придется приводить типы, что само собой намекнет на говнокод...

                                      вот о чем я говорю, как можно было допустить ошибку здесь?
                                      > bool b; if(b == true) {
                                      и ты называешь себя гениальным и умеющим все проверять?

                                      ты уверен что валгринд находит порчу памяти? может он находит только утечки?

                                      ассерты для того и нужны чтоб работать при ошибках... если есть ошибки ассерты будут срабатывать, программист это видит и правит их...
                                      Ответить
                                  • кстати, как можно ускорить выполнение программы, уменьшая выделенный в стеке буфер? это в любом случае одна и та же операция вида "указатель на вершину стека увеличить на n". Ты ведь хуйню какую-то порешь, неуважаемый.
                                    Ответить
                                    • спроси у того кто использовав гото выиграл аж 0,5% производительности... уверен что он проверит, а не быстрее ли функция на меньшем буфере...
                                      Ответить
                                  • и про 0,005% ты какую-то хуйню пореншь, если ты не заметил, то моя функция работает в двое быстрее самой быстрой встроенной (которая непортабельна и на некоторых системах у меня не заводится) и в 8 раз быстрее спринтфа. на сим соси хуй повторно. объясни пожалуйста, где тут смеяцца-то.
                                    Ответить
                                    • если у тебя в команде есть люди которые написали гото (там где должен быть do-while) ради 0,5% производительности, то будь готов что они повторят этот фокус...
                                      Ответить
                                      • мама дарагая =) вот вы тут сретесь из-за двух копеек
                                        Ответить
                                        • между прочим за 0.5% производительности с перспективой ускорения... это вам не 2 копейки...
                                          Ответить
                                          • да-да, я помню. дроч на биты и секунды.
                                            Ответить
                                            • Вообще крики из-за goto в коде, там где должно быть что-то повыше уровнем. :)
                                              Ответить
                                            • человек, между прочим, писал что это существенно, так что не нам с вами судить...
                                              Ответить
    • милять, вместо mongodb прочёл monogdb, долго думал
      Ответить
    • Тут еще не хватает комментов
      // do not localize!
      после каждой строки с цыфорками
      Ответить
    • народу для чего-то надо быстро конвертировать мелкие числа в строку. без контекста я бы сказал что не говно.

      ЗЫ и я не сомневаюсь что код никто руками не писал - мы *НИХоводы для это мелкие однострочные скрипты держим. даже на том же шелле это в одну строку делается.
      Ответить
      • >>мы *НИХоводы

        такое впечателение, что все остальные тут пишут под OpenVMS
        Ответить
      • Не, все-таки держать отдельный объект (скрипт) — не комильфо. Если рядом с этим будет написан код заполнения, мне кажется, будет правильнее.
        Вот, например, у нас юзается много подобных структур:
        1, ptr1,
        3, ptr3,
        10, ptr10,
        ...
        Из соответствующей структуры пар на старте делаем массив указателей, чтобы обращаться по индексу.
        Ответить
      • зачем его пересоздавать? один раз создал, закомитил, ..., профит!
        Ответить
    • Нихера себе... Последний раз я такой большой срач, чтобы без хуйни (все посты по теме) видел только под своим 2172.
      Ответить

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