Replies (52)

  • @qnikst, "отладочный printf" Это всё что нужно знать об уровне этого кода ;)
  • @qnikst, значит криво работает в другом месте
  • @qnikst, Ебать ты орк // valgrind
  • @L29Ah, вот меня сейчас очень напрягло, что я в том же духе высказываюсь, что и ты. А ты, обычно, упорот просто в край
  • @zinid, ты в jabber.ru аккаунте бываешь? или это у меня подписка отвалилась?
  • @oxpa, давай я тебе дам эту задачу, и если ты напишешь лучше, то тогда и поговорим?
  • @qnikst, самое главное, что это не отменяет того, что вызов функции меняет поведение, и будет там не debug а `foo` незаинлайненое, то ты увидишь тоже самое
  • @qnikst, щас я закончу свою задачку и приду
  • @oxpa, gist.github.com там задача тестовые файлы и исходники на других языках
  • @qnikst, ты злой. Мне работать надо :(
  • @qnikst, а как время замеряется?
  • @oxpa, `sys-process/time`: time -v — ./a.out < R49... > /dev/null
  • @oxpa, есть ещё целая ночь, никто никуда не спешит. Если есть желание написать на go, ruby или ещё какой яве то тоже welcome.
  • @qnikst, а то что в словах по 4 символа использовать нельзя?)
  • @oxpa, тьфу ты. по 5. суффикс и префикс — 5 символов
  • @oxpa, Пруф или L29Ah отличается умом и сообразительностью.
  • @qnikst, в С варианте можно сэкономить чуть-чуть, наверно, если \n из ввода дописывать в конец суффиксов. тогда не придётся лишний dumpstr звать
  • @oxpa, Он норм
  • @oxpa, предположения о размере слов делать нельзя, он может меняться. Предположение о конце строки \r или \r\n тоже
  • @oxpa, так можно, кстати, да
  • @qnikst, где-то у меня была заначена красивая парсился http запросов на sse. Мож поиграюсь... вряд ли, впрочем, на коротких строках я обойду вариант со switch'ом
  • @oxpa, ещё из адских вариантов:
    1. таки копировать из входной строки предобрабатывая и выравнивая, например, тогда копирование можно наверняка удешевить, это самое дорогое сейчас
    2. копировать можно в хитрый буффер по 32байта. 1 под тэг и остальные или под строку или под указатель, длина, отступ +- какой-нить ад, чтобы это быстрее работало.
    3. отдельно или в дополнение к тому что выше это то, что копировать слова можно уже не по байту а словами или длинными словами.

    В общем простор ещё есть..
  • @qnikst, это все что нужно знать об этом "программисте"
  • @qnikst, 1. define "лучше" (что за метрика?)
    2. define "поговорим"
    3. где данные-то брать?
    4. задачу хорошо б поточнее сформулировать, а то я так оптимизну, что начнутся крики.
  • @solhov, мне не интересны комментарии вида "debug print? о-ло-ло это не программист, понятно какая там программа и т.п.", но я готов выслушать подобные программы от тех кто написал подобную програмку. Лучше = понятнее, менее жрущее, более быстрое. Основная метрика — скорость выполнения.

    Задача:
    1. на stdin программы подаются данные в следующей форме: слово, один или несколько пробельных символов, слово, символы переноса. Нормально предполагать что пробельные символы это только ' ', перенос это или \n или \r\n.
    2. На выход программа должна подать по строке состоящей из одного слова состоящего из двух частей — первая это слово из первого столбца, вторая из второго слова. Т.е. получается произведение множеств.
    3. malformed строк нет.

    Пример:

    вход:
    ```
    a b
    c d
    ```

    выход:
    ```
    ab
    ad
    cb
    cd
    ```


    что-нибудь ещё уточнить?
  • @qnikst, где брать тестовый набор и примерные времена для сравнения ну и рефернсная конфигурация железа.
  • @solhov, gist.github.com там есть ссылка на файлик с данными, времена и текст. Щас спрошу у @dmz, что у него за ноут.

    У меня самый быстрый си на 4 cores (при отключенном HT) i706700HQ, cpu: 3311.096Mhz, cache size: 6144KB, 64bit, (16GB Ram, SSD, но это не важно на текущих данных). там прогоняется за 0.59-0.61c, сама програмка в самом низу тоже есть.
  • @qnikst, "@dmz> да какой-то ноут я уже не помню ещё до хасвела" (с)
  • @solhov, на самом деле мне очень интересно как будет написана быстрая сишная программа, т.к. я сам в си не очень умею
  • @qnikst, ну поскольку оно тормозиться будет о вывод, то важно в свете возможного размера буферов, скорости памяти и куда оно срется (/dev/null, HDD, SSD и т.д.)
  • @solhov, /dev/null или md5
  • @solhov, у человека который это начал оно летит в пайп другой программы, про которую ничего не известно, поэтому договорились мерять на /dev/null
  • @qnikst, заменяй на sprintf и в продакшен!
  • @zinid, да, там проблема в выводе, во всех языках что использовали то, что по умолчанию тупит и надо свою буфферизацию делать
  • @zinid, пасиб кстати за вариант
  • @zinid, с чего бы это?
  • @zinid, ну или брать из либы готовый или городить, во всех языках что тестили (c,haskell, rust, go, java, ada, pypy/python) нужна своя буфферизация или все плохо, в некоторых оно есть либой/из коробки, но это сути не меняет.
  • @qnikst, офигеть, увеличил пару внутренних буферов на 8 (при из размере порядка 110000) и программа ускорилась в 2 раза.. я что-то много не знаю о си..
  • @qnikst, извините, показалось, видимо спать пора. оно и было уже так
  • @zinid, лучше идеоматического haskell получилось
  • @qnikst, 1. в тестовом примере последняя строка — малформед
    2. я сегодня добрался до написания сишной версии. она у меня работает в 21 раз быстрее питона.
    3. это еще актуально?
  • @zinid, termbin.com

    код гразненький, делаются некие неявные предположения о входных данных (ну типа длина слов не превышает размер буфера в 128К, ошибки аллокации памяти не проверяются и т.д.)
  • @zinid, да, но просили же.
  • @zinid, почти четверть отыграл, получается.
  • @zinid, да ничего подобного, все говно в разборе строки исключительно. переделай на рагель и будет конфетка.
    это, кстати, можно до плюсов проапгрейдить, для любителей писать в одну строку и т.п.
  • @zinid, окей: termbin.com
  • @zinid, тут уже какие-то артефакты пошли, у меня новый вариант ускорился в 2.6 раза, у тебя только в 1.7 раза.
  • @zinid, шланг -03, 3.9.1 (старье, да)
  • @zinid, возможно дело в железе-памяти.
    E3-1231 v3 @ 3.40GHz
    4-х канальна ddr3-1600
  • @zinid, ну да, вероятно для моего проца лучше оптимизируется/лучше утилизируется память на запись. хотя может и в шланге дело.

    в общем у меня выходит так:

    ( ./v-stream < 49zGQ6Zt.txt > /dev/null; ) 0.30s user 0.00s system 99% cpu 0.300 total
  • @solhov, а, ну собственно из объема выходного файла в гигабайт получается что время работы лимитируется снизу скоростью записи одного потока в память. у меня выходит около 3.3ГБ/с, что пожалуй близко к пределу.