Dmitry
dmz@zen ~/tmp/bsfuck $ time ./qnikst5 < ./49zGQ6Zt.txt > /dev/null
real 0m0.371s
user 0m0.368s
sys 0m0.000s
Alexander
офигеть
Dmitry
блин, почему у меня медленнее
Dmitry
разница только в выхлопе, без него 0.015
Alexander
у тебя буффер умнее
Alexander
или константы другие
Alexander
просто у меня после последнего изменения и 0.40 до 0.18 прыгнуло
Alexander
я ВОООБЩЕ не понимаю как это может быть
Alexander
char out_buf[BUF_SIZE]; -> char out_buf[BUF_SIZE+8] ускоряет в полтора 2 раза
Alexander
а нет
Alexander
это мне спать пора
Alexander
все нормально
Alexander
@voidlizard ещё можешь попробовать сделать как у меня
Alexander
if (len >8) {memcpy(,,len)}else{memcpy(,,8)}
Alexander
если гарантировано что не вылезаешь за память
Alexander
у меня гарантировано не вылезаешь
Dmitry
м, перезатирать чт ли? делать memcpy(8), а добавдять сколько там было?
Alexander
да
Dmitry
dmz@zen ~/tmp/bsfuck $ time ./fixchunks < ./49zGQ6Zt.txt > /dev/null
real 0m0.438s
user 0m0.432s
sys 0m0.008s
Dmitry
0.410 и наврнео, надо спать
Alexander
если я добавлю таб ничего особо не поменяет
Dmitry
олимпиада получилась очень специальной
Alexander
хм.. а у тебя что хранится отступ и длина?
Dmitry
более специальной, чем обычно
Dmitry
у меня сами чанки хранятся
Alexander
а вижу
Alexander
ну тогда из-за этого наверное, ты ж их копируешь?
Dmitry
можно наверное срезать на этом, раз уже сотые пошли. но я не буду
Alexander
я то не модифицирую то что пришло
Dmitry
только один раз
Alexander
просто индекс строю
Dmitry
а, понятно
Dmitry
ты читаешь в растущий буфер
Alexander
оно без realloc у тебя?
Dmitry
прям как есть
Alexander
да
Dmitry
у меня хитрее
Alexander
ну я могу сделать lazy-bytestring из буфферов
Dmitry
т.е если помещается - то читается прям в ячейку, а если нет - то хранится указатель
Alexander
а не, не могу
Alexander
угу
Dmitry
и тогда зовется реаллок для чанка. но поскольку они тут 5, то всегда помещается
Alexander
а ты реаллок этого хранилища делаешь когданить?
Dmitry
да, много раз
Alexander
а ну тогда сравнимо должно быть
Dmitry
может, надо поменьше
Alexander
в общем я знаю как моё ускорить
Alexander
но не буду, хотя просто
Dmitry
вообще не влияет
Alexander
нужно не в растущий буффер читать, а в linked list буфферов
Alexander
все равно я индекс строю потом отдельно
Alexander
но тут не влияет тут файл в буффер помещается
Dmitry
там на чтение что-то типа 0.015
Alexander
а ясн
Dmitry
хотя разница как раз где-то на эти миллисекунды
Dmitry
между двумя решениями, я имею ввиду
Alexander
ага
Alexander
хм получается на моем компе разница с Haskell в 10 раз
Alexander
это печальненько немного
Alexander
с другой стороны в сторону вложено гораздо больше времени даже на такую тривиальщину
分解物質
adam
Cheese
Duff device
Alexander
в последней версии это закоментировно
Alexander
там выше обсуждение, что компилятор умеет заменять memcpy с константой на специализацию более эффективную
Alexander
но сам так проверку не разворачивает
Dmitry
убираю strchr, получаю 0.360 - 0.410 и выхожу. надо завязывать с этой токсичной темой. Отрыв от Rust - в 4 раза. https://gist.github.com/voidlizard/4dd7941d98b557a39e251109340335bf
Alexander
да, уже какие-то копейки пошли
Alexander
дальше только убирание realloc-ов всех но это важно на больших файлах только
Aragaer
0.360 это уже всего на 20% медленнее, чем просто записать нулей из /dev/zero
Dmitry
да. на больших, кстати, начинает тормозить
Alexander
vmsplice и прочее не оправдалось
Alexander
оно конечно O(N) но амортизировано
Dmitry
возможно, версия со списком работала бы лучше, но - довольно.
Alexander
ну нужно linked-list буфферов
Alexander
все остальное останется таким же, только for { for на выводе посложнее будет
Dmitry
у меня же где-то валяется, я это уже сделал
Dmitry
нунахер!!
Alexander
вот да
Dmitry
хватит.