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

    +123

    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
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    #include <malloc.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdint.h>
    
    typedef struct {
      char * begin;
      uint64_t size, data_size;
    } str_t;
    
    inline uint64_t max(uint64_t a, uint64_t b) {
      return (a > b) ? a : b;
    }
    
    inline str_t correct_data_size(str_t str, uint64_t new_size) {
      if(str.data_size < new_size) {
        str.data_size = (max(str.data_size, new_size) << 1);
        str.begin = realloc(str.begin, str.data_size);    
      }
      return str;
    }
    
    inline str_t concat(str_t dest, str_t src) {
      uint64_t new_size = (dest.size + src.size - 1);
      dest = correct_data_size(dest, new_size);
      memcpy((dest.begin + dest.size - 1), src.begin, src.size);
      dest.size = new_size;
      return dest;
    }
    
    inline str_t create_str(char * str, uint64_t size) {
      return (str_t){.begin = strcat(malloc(size), str), .size = size, .data_size = size};
    }
    
    inline void print_str_t(str_t str) {
      fprintf(stderr, "str = %ssize = %lu, data_size = %lu\n", str.begin, str.size, str.data_size);
    }
    
    uint64_t test(uint64_t star_n, uint64_t n, str_t str, str_t * gstr) {
      uint64_t end = (star_n + n);
      do {
        *gstr = concat(*gstr, str);
        
        char * pos = gstr->begin;
        while((pos = strstr(pos, "efgh")))
          memcpy(pos,"____",4);
        
      } while((++star_n) != end);
      return star_n;
    }
    
    int main(void) {
      char data[] = "abcdefghefghefgh";
      str_t str = create_str(data, sizeof(data)); 
      str_t gstr = create_str("", 1);
      time_t starttime = time(NULL);
      
      uint64_t block_c = 0;
      
      while((block_c = test(block_c, ((256/16) * 1024), str, &gstr)) != (((256/16) * 1024) * 20))
        printf("%ldsec\t\t%lukb\n",time(NULL)-starttime,gstr.size/1024);
      
    }

    Минимально оптимизированный вариант в царь-стиле теста из предыдущего ГК. Никто не увидел и начали на меня кукарекать. То ещё ГК, давайте объясняйте что здесь говно.

    Запостил: superhackkiller1997, 11 Июля 2013

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

    • Там по ссылке в последнем комментарии есть код. http://pastebin.com/3RVZG6RT
      Он выдает у меня результаты процентов на 25 быстрее твоего, при этом вдвое короче. Хотя возможно он просто что-то не то делает, я не проверял.
      Ответить
      • Может быть, там принтф реже делался?
        Ответить
        • Нет.
          Вывод теста superhackkiller1997:
          4sec            256kb
          13sec           512kb
          29sec           768kb
          52sec           1024kb
          80sec           1280kb
          116sec          1536kb
          157sec          1792kb
          205sec          2048kb
          259sec          2304kb
          320sec          2560kb
          387sec          2816kb
          461sec          3072kb
          542sec          3328kb
          629sec          3584kb
          723sec          3840kb
          824sec          4096kb
          931sec          4352kb


          Вывод вражеского теста:
          exec.tm.sec     str.length
          3sec            256kb
          10sec           512kb
          23sec           768kb
          40sec           1024kb
          63sec           1280kb
          90sec           1536kb
          122sec          1792kb
          160sec          2048kb
          202sec          2304kb
          250sec          2560kb
          303sec          2816kb
          361sec          3072kb
          425sec          3328kb
          496sec          3584kb

          Система: intel i3 M370, Win7.
          gcc 4.5.2
          Тестить под линуксом и под новым gcc лень.
          Ответить
          • Вывод теста superhackkiller1997:
            1sec            256kb
            2sec            512kb
            3sec            768kb
            5sec            1024kb
            7sec            1280kb
            10sec           1536kb
            14sec           1792kb
            19sec           2048kb
            24sec           2304kb
            29sec           2560kb


            Вывод вражеского теста:
            0sec            256kb
            1sec            512kb
            2sec            768kb
            4sec            1024kb
            7sec            1280kb
            10sec           1536kb
            14sec           1792kb
            18sec           2048kb
            23sec           2304kb
            29sec           2560kb


            Система: 3.8.6-gentoo #2 SMP PREEMPT Sun Apr 21 15:21:31 UTC 2013 x86_64 Intel(R) Core(TM)2 CPU 6320 @ 1.86GHz GenuineIntel GNU/Linux

            gcc версия 4.9.0-pre9999 20130708 (experimental) commit fda9f85fe1d91f9b64ebf10816e3365aa01c5a74 (Gentoo 4.9.0_pre9999)


            И чем дальше - тем больше он сливать будет, а так сливает он просто в хлам, но ты увидишь это лишь на тысячах секунд, ибо 99.93% делается тот вайл.
            Ответить
            • Хм. И все-таки, то что даже у тебя говнореализация дает чуть меньшее время на строках до 2Мб - погрешность эксперимента или факт?
              Ответить
              • Это не погрешность - это факт, впили туда нормальную времямерилку, а не это говно.

                Берём, выкидываем реплейс и смотрим за сколько оно делает вставки:

                Мой пацанский вариант:
                0sec            256kb
                1sec            512kb
                1sec            768kb
                1sec            1024kb
                2sec            1280kb
                2sec            1536kb
                3sec            1792kb
                4sec            2048kb
                5sec            2304kb
                6sec            2560kb
                7sec            2816kb
                8sec            3072kb
                10sec           3328kb
                11sec           3584kb
                13sec           3840kb
                15sec           4096kb
                17sec           4352kb
                18sec           4608kb
                21sec           4864kb


                Это говно:
                0sec            256kb
                1sec            512kb
                2sec            768kb
                3sec            1024kb
                4sec            1280kb
                6sec            1536kb
                8sec            1792kb
                11sec           2048kb
                14sec           2304kb
                17sec           2560kb
                21sec           2816kb
                25sec           3072kb
                31sec           3328kb
                37sec           3584kb
                44sec           3840kb
                51sec           4096kb
                60sec           4352kb
                70sec           4608kb
                81sec           4864kb
                Ответить
                • Царь:
                  0.055510sec             256kb
                  0.223295sec             512kb
                  0.503716sec             768kb
                  0.893441sec             1024kb
                  1.393966sec             1280kb
                  2.005494sec             1536kb
                  2.730105sec             1792kb
                  3.567771sec             2048kb
                  4.514229sec             2304kb
                  5.573449sec             2560kb


                  Иное:
                  0.163896sec             256kb
                  0.656153sec             512kb
                  1.477083sec             768kb
                  2.624863sec             1024kb
                  4.113905sec             1280kb
                  5.943257sec             1536kb
                  8.121353sec             1792kb
                  10.661016sec            2048kb
                  13.590864sec            2304kb
                  17.068162sec            2560kb
                  Ответить
                  • Насчет вставок да, я и сам проверил - полный слив. Но как все-таки объяснить результаты исходного теста с реплейсом, ведь цикл замены один и тот же.
                    Ответить
                    • а, ну да. У него pos = strstr(pos + 4, "efgh"), у тебя pos = strstr(pos, "efgh"). Вот и нашлось говнонедостаток в твоем коде, лишние 4 символа проверяешь в цикле, на который уходит большая часть времени.
                      Ответить
                      • Это ничего не стоит - он считерил, ибо в исходном коде этого нет. Он мог сразу писать mov() писать.

                        И да, это не оригинальный код - я этого кода даже не видел, оригинал в ГК ниже.
                        Ответить
                        • Конечно не оригинальный. Просто это показывает что твоя реализация тоже не идеальна - нет никакого смысла проверять 4 символа, которые мы только что заменили. И этот факт сводит на нет все преимущество от высокой скорости конкатенации в данном тесте. Ты же сам просил найти говно.
                          Ответить
                          • Это читерство - раз. Смысла в этом коде вообще нет, ибо мы можем strstr() тупо выпилить.

                            Далее, это не даст перфоманса, ибо strstr() так работает.

                            int main(void) {
                              double start_time = omp_get_wtime();    
                              char str[] = "abcdefghefghefgh";
                              uint64_t i = 1024ul*1024*1024;
                              while((i -= (!!strchr(str, 'e')))); //либо while((i -= (!!strchr(str + 4, 'e'))));
                              printf("%lfsec\n", (omp_get_wtime() - start_time));
                            }
                            //1.248129sec
                            //1.247901sec


                            Разница уже в пределах погрешности - поэтому профита нет.
                            Ответить
                            • Действительно, нет разницы. Но его версия с while у меня все равно стабильно выигрывает. Замена на 32-битные типы не влияет. Завтра проверю на linux\новом gcc.
                              Ответить
                              • Это гон - значит это какой-то баг в вашей маздайке, либо 32битных питухах. Не может так, что выпилив вайл у тебя мой код выигрывал, а впиля его назад проигрывал.

                                Покажи -S - я погляжу.
                                Ответить
                                • Твой код:http://pastebin.com/jwVBv5pd
                                  Выхлоп gcc:http://pastebin.com/LBcp9x7F
                                  Их код: http://pastebin.com/Ki0Kc5y3
                                  Выхлоп gcc: http://pastebin.com/CxKKrT0S
                                  Ответить
                                  • Ничего, кроме 32битного недоассемблера и питух майздайки, криминального не вижу.

                                    Значит это что-то у вас там нитого.
                                    Ответить
                                    • Видимо проблема в особенностях работы аллокатора старого mingw. А с выкидыванием while твой код у меня оказался быстрее, т.к. я лишнюю строчку выкинул, в результате gcc всю процедуру счел бесполезной и выкинул.
                                      Ответить
                          • > нет никакого смысла проверять 4 символа
                            Да, согласен Но там есть и баг - этот алгоритм никогда не заменяет первые 4 символа строки. На этой задаче канает, на более общей - хуй. Если хочется сделать +4, то это надо делать после memcpy, а не в аргументе strstr's.
                            Ответить
                            • Да, тоже заметил когда уже спать лег. Но на скорость в данном случае эта оптимизация все равно не влияет.
                              Ответить
                    • Кстати - я ещё раз перепроверил:

                      Мой:
                      0.170717sec             256kb
                      0.675025sec             512kb
                      1.514286sec             768kb
                      2.691558sec             1024kb
                      4.218068sec             1280kb
                      6.093906sec             1536kb
                      8.317285sec             1792kb
                      10.907213sec            2048kb
                      13.943829sec            2304kb
                      17.344343sec            2560kb


                      Его:
                      0.278990sec             256kb
                      1.105548sec             512kb
                      2.484023sec             768kb
                      4.416370sec             1024kb
                      6.930708sec             1280kb
                      10.020535sec            1536kb
                      13.713997sec            1792kb
                      18.108874sec            2048kb
                      23.187203sec            2304kb
                      29.037559sec            2560kb


                      Значит я в прошлый раз чего-то нитого намерил. Пропитушился.
                      Ответить
        • Скорее всего у него 32битный питух - пусть поменяет типы на 32битные инты и не рабочий инлайн, и то это врядли даст 50% потерю перфоманс.
          Ответить
          • Питух - это линупс? Умничка, научился выговаривать.
            Ответить
          • Атлон 2GHz, 32 битная линуха, -O2.

            Код superhackkiller1997, в котором uint64_t заменены на uint32_t:
            3sec 256kb
            10sec 512kb
            22sec 768kb
            39sec 1024kb
            61sec 1280kb
            88sec 1536kb
            120sec 1792kb

            Код с ideone:
            2sec 256kb
            10sec 512kb
            26sec 768kb
            50sec 1024kb
            81sec 1280kb
            116sec 1536kb
            157sec 1792kb

            И чем дальше - тем больше разница. По идее из-за realloc'а на каждую строку.
            Ответить
            • Ну царь тащит, а маздайка нет.
              Ответить
            • Нет, не из-за реалока. В реальном коде разница будет ещё больше, ибо будет уже O(n^4), пока в этом коде реалок ничего не стоит.

              Тормазит тут strcat(), ибо стоит n в лучшем случае, n^3 в худшем. два strlen() + один мемкопи. У меня же только мемкопи, без стрлена. У меня конкатенация стоит O(1) в данном случае. В твоей портянке оно стоит в районе n.
              Ответить
        • показать все, что скрыто???????
          Ответить
      • Не может такого быть по определению. Тут 99.93% времени выполняется вот эта байда:
        while((pos = strstr(pos, "efgh")))
              memcpy(pos,"____",4);


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

        Поэтому у тебя там что-то врёт.
        Ответить
    • И да, это реализация строк без strlen(), реализован свой конкат. Аля питух-вектор. Поэтому тут на 10строчек больше. Да и написанно не как вырвиглазное говно.
      Ответить
    • ... И ни одного вызова free()
      Деаллокация для анскиллед питухов?
      Ответить
      • А зачем тут деаллокация? man realloc() в c99. При завершении программы куча итак убивается - смысла в деаллокации gstr->begin() - твоя программа только дольше работать будет.
        Ответить
    • Мелкая придирка к коду: в 17й строке max не нужен, после str.data_size < new_size ты и так знаешь, что new_size больше.
      Ответить
      • Это моя попытка уменьшить пожирание им адресного пространства - там поидее не data_size, а просто size должно быть. Хотя конечно - это бессмысленно, и проще выпилить всё это нахрен.
        Ответить
    • Охуительные у вас проблемы.
      Ответить
    • А чё требуется-то посчитать?
      Ответить
      • Ничего хорошего. Это бессмысленное писькомерство фаллометрическое состязание между языками, которое ты можешь созерцать по этой ссылке:
        http://raid6.com.au/~onlyjob/posts/arena/

        Задача звучит примерно так - до посинения приклеивать в конец строки "ghjk", а затем пробегая по всей строке(!) заменять "ghjk" на "____".
        Ответить
        • А чего жабаскрипт так плохо в мозилке работает?
          Ответить
        • А Путхон (не 3) порадовал.
          Ответить
          • Там чувак вместо кошерного str.replace зачем-то re.sub использует (регулярные выражения)
            Ответить
            • re.sub не настолько медленнее (хотелось бы бенч), там самое тормозное место - генерация регекспа, а они кешируются.
              Ответить
              • re.sub

                exec.tm.sec     str.length
                3 sec           256 kb
                13 sec          512 kb
                30 sec          768 kb
                54 sec          1024 kb
                86 sec          1280 kb
                126 sec         1536 kb
                173 sec         1792 kb
                228 sec         2048 kb
                292 sec         2304 kb
                359 sec         2560 kb
                438 sec         2816 kb
                521 sec         3072 kb
                612 sec         3328 kb
                708 sec         3584 kb
                815 sec         3840 kb
                926 sec         4096 kb


                str.replace

                exec.tm.sec     str.length
                1 sec           256 kb
                7 sec           512 kb
                18 sec          768 kb
                32 sec          1024 kb
                51 sec          1280 kb
                75 sec          1536 kb
                103 sec         1792 kb
                135 sec         2048 kb                                                                                                       
                172 sec         2304 kb                                                                                                       
                212 sec         2560 kb                                                                                                       
                255 sec         2816 kb                                                                                                       
                304 sec         3072 kb                                                                                                       
                357 sec         3328 kb                                                                                                       
                415 sec         3584 kb                                                                                                       
                477 sec         3840 kb                                                                                                       
                542 sec         4096 kb


                Python 2.7.2 @ Core i7-860
                Ответить
                • Разница в константе в 1.7 раза. Не так уж и плохо для регулярок.
                  Ответить
                  • Почему в кностанте, а не в коэффициенте?
                    Ответить
                    • Эм, если меня не подводит память, то в контексте О большого говорят константа, а не коэффициент...
                      Ответить
                      • Константой вообще называется неизменяемая величина, которая может находиться где угодно. Она может быть слагаемым, она может быть коэффициентом (внезапно, да?), она может быть показателем степени и даже (о, ужас!) основанием. И совсем уж неожиданно, что все те же роли может играть не только константа, но и переменная.

                        Никого не запутал?
                        Ответить
                        • Константа может быть коэффициентом, а вот коэффициент не может быть слагаемым. Почему под константой имеется в виду именно множитель, а не слагаемое?
                          Ответить
                          • Потому что рассматривают не точную формулу, а асимптотику при n→∞, когда изо всех слагаемых выживает одно, наиболее быстро растущее.
                            Ответить
                            • Логично, но коэффициент при самом быстрорастущем члене - это разве единственный возможный параметр?
                              Ответить
                        • Думаю, bormand имел в виду такую постановку вопроса: константа в O для re.sub в 1.7 раз больше чем для str.replace

                          Ибо O(n) обозначает, что время выполнения равно C * n, где C та самая константа. В нашем случае - где-то O(e^n), что соответствует C1 * e ^ (C2 * n), и речь идет о C1
                          Ответить
                          • C1 * e ^ (C2 * n) = (C1 * e^n) * e^C2 = C1_1 * e^n. Пример не самый лучший.

                            П.С. Ты не мяут с сырцов?
                            Ответить
                            • Умножение степеней раскрывается в сложение показателей а не их произведение, а e ^ (C2 * n) = (e ^ C2) ^ n
                              Ответить
                              • Да, я чет натупил.

                                Получается, С2 будет гораздо важнее С1. Разница между n^x и n^(x/2) будет гораздо больше, чем между k*(n^x) и n^x.
                                Ответить
              • Во, кстати, если надо учесть время генерации регекспа - то их надо отдельно компилировать, иначе они закешируются.
                Ответить
        • gstr+=str

          Блядь они ебанаты, ну ясен хуй ява будет сливать, там нет никаких оптимизаций и будет O(n^2). Там совсем макаки сидят, которые про StringBuilder не слышали?

          Кстати, а почему в яве нет оптимизаций? В цпитоне это давно оптимизировано, хотя лучше список / bytearray.

          > а затем пробегая по всей строке(!)
          А, так O(n^2) там запрограммировано.
          Ответить
          • Но сишка-то не тормазит, хотя там > O(n^3), а на остальныех O(n^2) еле набирается.

            Даже ущербная реализация ан сишке, которая O(n^3) - мои стрки стоят меньше, чем O(n) - во всех языках тоже. Реплейс в сишке сделан по-ущербснки - во всех других ЯП это реализованно лучше.

            Но даже несмотря на тотальный слив по O() у сишки - она в хламину рвёт всё живое.
            Ответить
            • Где там N^3, я этот пиздец прочесть не могу?
              Ответить
              • lngth=strlen(str)*i; - стоит n, но строка маленькая, поэтому не чувствуется
                gstr=realloc(gstr,lngth+str_len); - стоит n, но тут не стоит.
                strcat(gstr,str); - стоит n^2.

                while(pos=strstr(pos,"efgh")) memcpy(pos,"____",4); - стоит в районе n, ералеьно чуть больше.
                Ответить
                • > strcat(gstr,str); - стоит n^2.
                  Не, strcat тупо O(n), где n суммарная длина строк. Тут же сначала пробегают по одной строке, замеряя ее длину, а потом пробегают по другой, копируя символы. O(n^2) было бы если бы там был бы двойной цикл.

                  Твой код в целом все-таки O(n^2).
                  Ответить
                  • Мой код O(n). Конкатенация стоит у меня O(1) в данном случае.

                    Да, некоторые вариации strcat() работают почти за O(n). Но они по вашему не безопасны, ибо они могут залезть в память за концом вашей строки. Хотя почему могут - они залезают.

                    Безопасный strcat() стоит дорого.

                    А так да, ты даже в чём-то прав. И да, копирование стоит O(n*2), а не n.
                    Ответить
                    • > И да, копирование стоит O(n*2), а не n.
                      O(n+m) если быть точным, где n и m длины исходных строк.

                      > Мой код O(n).
                      У тебя внешний цикл, растущий пропорционально n. И внутри него цикл поиска\замены, который тоже растет пропорционально n. Отсюда O(n^2). Если построишь график по числам, которые выводит код - должно получиться что-то типа параболы.
                      Ответить
                      • >O(n+m) если быть точным, где n и m длины исходных строк.
                        O(min(n, m)*2). Это понимают все, поэтому n*2.

                        Внешний цикл мы не учитываем - мы учитываем общую сложность конката и реплейса.
                        Ответить
                    • Вот такой график: http://rghost.ru/47384314.view
                      Ответить
                • Кстати, вот никогда не понимал, нахера strcat возвращает указатель на начало буфера, который у меня уже и так есть. Почему они не додумались вернуть указатель на следующий символ (gstr+strlen(str))? Само собой я могу прибавить длину строки к указателю, но лень же...
                  Ответить
                  • В этом и суть - я тоже это не плюблю. Нужена такая модификация strcat(), но никто пока не запилил.
                    Ответить
          • > StringBuilder не слышали
            Так тут задача специально хитровыебанная, чтобы яву слить (и любой другой язык с иммутабельными строками)... Заметь как построены итерации - добавляем чуть-чуть хуйни, прогоняем реплейс по всей строке. В итоге на каждом шаге клеятся всего 2 строки, стрингбилдер здесь не поможет.
            Ответить
            • Да, тут свой велосипед для замены в изменяемых строках городить надо.
              Ответить
        • Я ввел небольшую оптимизацию в тесте C
          Вместо
          pos=gstr;
          сделал
          pos=gstr+(i-1)*16;
          а в тесте c++ сделал
          end = (i-1)*16

          И все вышло как я и полагал C:
          0sec 256kb
          1sec 512kb
          2sec 768kb
          4sec 1024kb
          7sec 1280kb
          12sec 1536kb
          16sec 1792kb
          21sec 2048kb
          29sec 2304kb
          39sec 2560kb
          52sec 2816kb
          68sec 3072kb
          85sec 3328kb
          105sec 3584kb
          127sec 3840kb
          150sec 4096kb

          cpp:
          0sec 256kb
          0sec 512kb
          0sec 768kb
          1sec 1024kb
          1sec 1280kb
          1sec 1536kb
          1sec 1792kb
          1sec 2048kb
          1sec 2304kb
          1sec 2560kb
          1sec 2816kb
          1sec 3072kb
          1sec 3328kb
          1sec 3584kb
          1sec 3840kb
          1sec 4096kb

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

              >ты идиот
              будь проще затупок
              Ответить
              • >В том то и дело, что ничего не потерялось. Мой код просто не перебирает лишние мегабайты, чтобы заменить 12 байт.
                Ты упоролся? Животное. Ты вообще понимаешь, что такое бенчмарк? Животное, ты понимаешь, что такое реплейс, животное? Реплейс обязан пройти ВСЮ строку, животное.

                http://pastebin.com/XxY3urQx - на тебе, питушок:
                0sec            256kb
                0sec            512kb
                0sec            768kb
                0sec            1024kb
                0sec            1280kb
                0sec            1536kb
                0sec            1792kb
                0sec            2048kb
                0sec            2304kb
                0sec            2560kb
                0sec            2816kb
                0sec            3072kb
                0sec            3328kb
                0sec            3584kb
                0sec            3840kb
                0sec            4096kb
                ...
                1sec            50944kb


                >будь проще затупок
                Питушок должен знать своё место.
                Ответить
                • Не знаю что ты о себе возомнил, но твой код и работоспособность это далеко не близкие вещи.
                  Ответить
                  • Щито-то конкретной есть? Ты понял, что сморозил херню, и твоё говно даже близко с моим царь-кодом не валялось? Дак прими это как мужик, и попробуй написать быстрее, либо так же.
                    Ответить
                    • Твое говно вообще не работоспособно. Ни в каком-либо варианте.
                      Вот дай ссылку на код, где он выводит полностью строки до и после изменения. Выведи мне хотя бы 4 строки так. М.б. если тупо скопировать из libc и сделать как инлайн, хотя не надо нихрена так делать, т.к. они нормально скомпонуются как функции, тогда может будет нормально работать.
                      В течении часа не дашь ссылку на адекватный вывод засчитываю слив.
                      Ответить
                      • Я не зря там написал print_str_t() - поставь после *gstr = concat(*gstr, str); - print_str_t(*gstr); - будет тебе вывод строк.

                        Ты несёшь какую-то херню, животинушка. Ты уже тотально слился и можешь не кукарекать.
                        Ответить
              • > Мой код просто не перебирает лишние мегабайты, чтобы заменить 12 байт.
                Тем самым ты нарушил условие задачи, читер хренов. Прочти уже оригинальную статью, чтобы понять почему все пишут такую херню, вместо того чтобы 1 раз прогнать реплейс после всех конкатенаций.
                Ответить
                • P.S. Или вообще забили бы хуй на реплейс и конкат, и сделали строку нужной длины, сразу заполненную ____.
                  Ответить
                • Я это сразу понял. Код с реалок в с выглядит нечестно, т.к. string в c++ время на выделение памяти будет во много раз меньше.
                  Ответить
                  • Да там все выглядит нечестно. Та же жаба из-за этого цикла реаллок+реплейс вообще сливается вхлам, т.к. стрингбилдер поюзать уже нельзя. Но все-таки раз автор такое условие задачи поставил - значит надо писать так.

                    P.S. У царя, кстати, память выделяется примерно как в с++. Не на каждую конкатенацию.
                    Ответить
            • А если скажешь почему на c++ такой быстрый даже не получишь по ебальнику, если мы с тобой когда-нибудь встретимся.

              Cause c++ superior in everything
              Ответить
              • Твой С++ говнище - я тебе выше дал портянку, которая сольёт твои С++ в такую хламину, что ты даже зассышь мне отписываться. И проподёшь, максимум сказав, что я идиот.
                Ответить
                • Давай так ты не хами, а я с тобой нормально спорю и разговариваю
                  Ответить
                  • Ты начал нести херню, а со сливерами, несущими херню - у меня разговор короткий.
                    Ответить
                    • Ага разговор на 300 сообщений. Ты мудила даже не допер что зеленый цвет означает.
                      Ответить
                      • Специально написал, ибо зассал спорить со мной, и сделал себе вариант для отхода.
                        Ответить
      • показать все, что скрыто???????
        Ответить
    • показать все, что скрытососу хуи даю в жопу
      ]Делаю минеты
      Ответить
    • http://pastebin.com/dUcQTdeL

      Что-то мне аж прям как-то не по себе... как-то очень по-читерски это :)
      Ответить
      • Для сравнения, код ОПа на той же машине:
        1sec		256kb
        4sec		512kb
        10sec		768kb
        17sec		1024kb
        27sec		1280kb
        38sec		1536kb
        52sec		1792kb

        И код с сайта:
        1sec		256kb
        4sec		512kb
        10sec		768kb
        18sec		1024kb
        28sec		1280kb
        41sec		1536kb
        56sec		1792kb

        Компилировал с -O3 gcc 4.6.3 Линукс 64 бит.
        Ответить
        • один хрен он не работает.
          Ответить
          • Реально, а что же он делает и где конкретно он не работает ты не скажешь?
            Ответить
          • Не работает что? Условие теста соблюдается, в коде ошибок не заметно...
            Ответить
            • Не все нормально.
              Ответить
            • Просто он тут всех на понт берет, надеясь, что код и правда не работает. А на самом деле коды он даже не читал, зачем утруждать себя?
              Ответить
              • Нет, он обычный плюсовек, адепт веры в стл. Он даже предположить не может, что код какого-то хрена с горы рвёт в хлам его любимое СТЛ, которое писала илита программобщества. Поэтому он ищет оправдания, аля мой код ничего не делает и поэтому быстрее.

                Так действуют 99% питушков, пытаясь доказать, что мой код не работает.
                Ответить
                • А ты знаешь что строка с размером это уже не c-style?
                  Ответить
                  • И что? Я Сишник - я могу запилить всё, что моей душе угодно. И это не обязательно должно быть систайл, либо так, как положенно в либц.

                    Поэтому Си - это ЯП, а остальные ЯП - это говно. Исключения с вариациями - это плюсы и асм.
                    Ответить
                    • > как положенно в либц
                      Да в сишной либе на строки вообще хуй положен ;) Строки с ноликом на конце, это, пожалуй, самый эпичный фейл. Набор функций в той же либц - коллекция разношерстного говна, часть из которого "забывает" приклеить тот самый нолик... Если не писать свои функции, и не использовать сторонние либы, работать со строками очень неудобно. С этим можно поспорить, но это факт.

                      С другой стороны - сишка и проектировалась как минималистичный язык, не навязывающий своих законов. И для тех мест, где сишка действительно нужна - от этого только профит.
                      Ответить
                      • То есть там, где нужна хоть какая-то стандартная библиотека, чтобы не изобретать велосипед для каждой поездки в магазин - сишка ненужна?
                        Ответить
                        • Так точно. На голой сишной стандартной либе далеко не уедешь. Даже несмотря на то, что в libc она полнее, чем описано в стандарте. И да, на прикладных задачах - сишка нинужна.
                          Ответить
                          • >на прикладных задачах - сишка нинужна.
                            Вот тот ответ, которого я ждал :)
                            Ответить
                      • Для маленьких строк, с быстрым доступом к памяти и малым кол-вом регистров - систроки быстрее, именно тогда их и запилили. Они требуют меньше оверхеда, а на 50% операциях strlen() достаётся бесплатно.
                        Ответить
                        • С точки зрения перформанса на мелких строках - да. С точки зрения экономии памяти и регистров - тоже да. Хотя даже х.з., если честно, насколько будет разница в производительности на реальной задаче на нынешнем железе.

                          А вот с точки зрения удобства нультерминейтед строки говно. Постоянная возня с ручным хранением длин, strlen'ом, дописыванием ноликов к strncpy и т.п.
                          Ответить
                          • Дак суть в том, что их делали, когда железо было другим - у тебя было 2-3регистра, в одном указатель - во втором 2-й указатель, и просто некуда было сувать длинну.

                            Сейчас это не сильно актуально, но в некоторых случаях си-строки реально удобней.

                            //файл вида 1;2;3;4;5;6;7;8;
                            //Мы берём указатель на первый симол - это начало первой строки.
                            //Далее, str = strchr(str, ';'); *str = 0; (str + 1) - это вторая строка.
                            //Таким макаром мы нереально быстро хреначим файлецы - быстро, удобно - тот же strtok().


                            Даже длинну строки мы знаем и т.п. strlen() не нужен, копирование не нужно - всё быстро, круто - в кеше.
                            Ответить
        • показать все, что скрыто???????
          Ответить
      • let string_index_of where what start =
          let length = (String.length where - 1) in
          let pattern = (1 lsl (String.length what + 1)) - 1 in
          let rec loop i j mask =
            if i == length + 1 then (-1)
            else if mask == pattern then i - j
            else if (where.[i]) == (what.[j]) then
              loop (i + 1) (j + 1) ((mask lsl 1) lor 1)
            else loop (i + 1 - j) 0 1
          in loop start 0 1;;
        
        let test =
          let initial = "abcdefgh" ^ "efghefgh" in
          let replacement = "____" in
          let replacement_length = String.length replacement in
          let initial_time = Sys.time() in
          let initial_length = String.length initial in
          let imax = (1024 / (String.length initial)) * 1024 * 4 in
          let rec loop s i =
            if i < imax then
              let concatenated = s ^ "efgh" in
              let sl = initial_length * i in
              let rec replace_loop st index =
                let index = string_index_of st "efgh" index in
                if index >= 0 then
                  ((String.blit replacement 0 st index replacement_length);
                   replace_loop st index)
              in replace_loop concatenated 0;
              if sl mod (1024 * 256) == 0 then
                Printf.printf "%f s | %d Kb |\n" (Sys.time() -. initial_time) (sl / 1024);
              loop concatenated (i + 1)
          in loop initial 0;;
        
        test;;

        | 0.000000 s   | 0 Kb    |
        | 2.391636 s   | 256 Kb  |
        | 9.571545 s   | 512 Kb  |
        | 21.645709 s  | 768 Kb  |
        | 38.595132 s  | 1024 Kb |
        | 60.230843 s  | 1280 Kb |
        | 85.499002 s  | 1536 Kb |
        | 115.210485 s | 1792 Kb |
        | 149.894213 s | 2048 Kb |
        | 189.687163 s | 2304 Kb |
        | 234.643328 s | 2560 Kb |
        | 284.425760 s | 2816 Kb |
        | 338.623521 s | 3072 Kb |
        | 397.648548 s | 3328 Kb |
        | 462.093751 s | 3584 Kb |
        | 531.867144 s | 3840 Kb |

        Почти!
        Ответить
    • Мой вброс:
      {$APPTYPE CONSOLE}
      uses
        {$IFDEF VER250}
        System.SysUtils, System.DateUtils;
        {$ELSE}
        SysUtils, DateUtils;
        {$ENDIF}
      const 
        str_const          = 'abcdefghefghefgh';
        start_len          = length(str_const);
        str: AnsiString    = str_const;
      
        imax = (1024 div start_len) * 1024 *4;
        
        find    	     = 'efgh';
        find_length        = length(find);
      
        replace: AnsiString = '____';
      var
        i, found, current_len: Cardinal;
        gstr: AnsiString;
        currentTime: TDateTime;
      begin
        currentTime := Time;
        WriteLn('exec.tm.sec':16, 'str.length':16);
      
        current_len := start_len;
        gstr := '';
        for i := 1 to imax + 1000 do
          begin
              gstr := gstr + str;
      
              found := 1;
              repeat
                found := Pos(find, gstr, found);
                if found = 0 then
                  break;
                Move(replace[1], gstr[found], find_length);
                Inc(found, find_length)
              until false;
              
      	if current_len mod (1024 * 256) = 0 then
                WriteLn(SecondsBetween(Time, currentTime):12, ' sec', current_len div 1024:13, ' kb');
      
              Inc(current_len, start_len)
          end;
        Halt(0)
      end.
      Результат:
      exec.tm.sec str.length
      1 sec 256 kb
      6 sec 512 kb
      14 sec 768 kb
      25 sec 1024 kb
      40 sec 1280 kb
      58 sec 1536 kb
      80 sec 1792 kb
      105 sec 2048 kb
      133 sec 2304 kb
      166 sec 2560 kb
      201 sec 2816 kb
      240 sec 3072 kb
      282 sec 3328 kb
      327 sec 3584 kb
      376 sec 3840 kb
      428 sec 4096 kb

      На той же машине немодифицированный cpp_test.cpp выдал:
      exec.tm.sec str.length
      4sec 256kb
      15sec 512kb
      34sec 768kb
      60sec 1024kb
      95sec 1280kb
      138sec 1536kb
      ^C

      Царский код выдал:
      3sec 256kb
      11sec 512kb
      25sec 768kb
      44sec 1024kb
      70sec 1280kb
      101sec 1536kb
      138sec 1792kb
      ^C
      Ответить
      • Твой код говно, процессор говно, маздайка говно:
        0.170717sec             256kb
        0.675025sec             512kb
        1.514286sec             768kb
        2.691558sec             1024kb
        4.218068sec             1280kb
        6.093906sec             1536kb
        8.317285sec             1792kb
        10.907213sec            2048kb
        13.943829sec            2304kb
        17.344343sec            2560kb


        3.8.6-gentoo #2 SMP PREEMPT Sun Apr 21 15:21:31 UTC 2013 x86_64 Intel(R) Core(TM)2 CPU 6320 @ 1.86GHz GenuineIntel GNU/Linux

        Твоё говно в 10раз медленнее, чем на моём коре2 за 500рублей. Меня твои говнобенчи не интересуют - вбрасывай и дальше, сравнивая на говноОСи, говно х86 и говноконпеляторе.
        Ответить
        • Какой код выдал такие числа?
          Ответить
          • Мой.

            Цифры того, что показал борманд:
            0.278990sec             256kb
            1.105548sec             512kb
            2.484023sec             768kb
            4.416370sec             1024kb
            6.930708sec             1280kb
            10.020535sec            1536kb
            13.713997sec            1792kb
            18.108874sec            2048kb
            23.187203sec            2304kb
            29.037559sec            2560kb
            Ответить
            • В этом ГК несколько версий показаний твоего теста. У меня есть подозрения, что код прошёл несколько редакций и отличается от того, что в заголовке.

              http://govnokod.ru/13408#comment187596
              http://govnokod.ru/13408#comment187601
              http://govnokod.ru/13408#comment187603
              http://govnokod.ru/13408#comment187608
              http://govnokod.ru/13408#comment187839

              Я хочу уточнить, в каком состоянии сейчас код.
              Ответить
              • Это код, который запощен как в ГК. Тот код - это вариации с выпиливанием некоторых частей - это код хорош настолько, что кроме max() из ничего почти ничего не выкинишь, не нарушая условия задачи.
                Ответить
            • Эм, что я там показал? kipar вроде бы кидал код из коментов к статье, а не я.
              Ответить
              • а да, прости. Чёт казалось, что это ты кидал. kipar кидал.
                Ответить
                • http://pastebin.com/3RVZG6RT
                  Этот код?
                  На моей маздайке и недопроцессоре:
                  exec.tm.sec str.length
                  3sec 256kb
                  12sec 512kb
                  29sec 768kb

                  Ещё раз для сравнения царский:
                  3sec 256kb
                  11sec 512kb
                  25sec 768kb

                  И ещё раз для сравнения Delphi с prefixed-length strings:
                  exec.tm.sec str.length
                  1 sec 256 kb
                  6 sec 512 kb
                  14 sec 768 kb
                  Ответить
                  • Меня не интересует твоё говно, которое в 10раз медленнее моих результатов. Что у тебя за процессор?

                    Это производительность памяти в районе второго пня. На чём ты собирал мой код, какая у тебя либц, где исходники strstr().

                    И да, менять 64битные инты на 32битные тебя не учили?

                    http://pastebin.com/XxY3urQx - собери это - это просто конкатенация без реплайса - выпили из своего кода реплейс, оставь просто добавление в конец строки.
                    Ответить
                    • Последний код:
                      0sec 256kb
                      0sec 512kb
                      0sec 768kb
                      0sec 1024kb
                      ...
                      4sec 239616kb
                      ...

                      После замены интов:
                      0sec 256kb
                      1sec 512kb
                      ...
                      3sec 239616kb
                      ...

                      Delphi без реплейса:
                      0 sec 256 kb
                      ...
                      1 sec 239616 kb
                      ...
                      2 sec 277248 kb

                      Итого: мне нужно оптимизировать поиск и замену.

                      Кстати, вариант с zero-ended strings + ReallocMem в Delphi тормозил страшно:
                      9 sec 256 kb
                      Короче, дальше можно не смотреть.

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

                    http://pastebin.com/5N7XBD45 - вот тебе вариант на 64/32 битных интах в зависимости от типа х86.
                    Ответить
      • показать все, что скрыто???????
        Ответить

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