A64m
хотя нет, сложно, чексуммы не совпадают
Anonymous
SML, в отличие от Окамля, вызывает C-функции напрямую
Alexander
а сдвиг на реальную длину делать, если запас есть
Alexander
splice для чтения отдачи в fd (хотя я не уверен, что это так работает)
Alexander
на сколько меня там обогнали, процентов 10 уже есть?
A64m
Да окамл у меня тормозит, 9 сек
A64m
но я не окамлист, одна надежда, у кого-нибудь бомбанет и он перепишет
Alexander
на сколько меня там обогнали, процентов 10 уже есть?
на моем тракторе: 0.867s vs 1.158s, но у меня макось и clang, так что на линухах может и по-другому все
分解物質
$ time ./1 < ./49zGQ6Zt.txt > /dev/null real 0m0.800s user 0m0.796s sys 0m0.002s $ time ./2 < ./49zGQ6Zt.txt > /dev/null real 0m0.726s user 0m0.708s sys 0m0.007s $ time ./3 < ./49zGQ6Zt.txt > /dev/null real 0m1.278s user 0m1.256s sys 0m0.008s gcc -O2 —------- $ time ./1 < ./49zGQ6Zt.txt > /dev/null real 0m1.314s user 0m1.282s sys 0m0.007s $ time ./2 < ./49zGQ6Zt.txt > /dev/null real 0m0.716s user 0m0.703s sys 0m0.006s $ time ./3 < ./49zGQ6Zt.txt > /dev/null real 0m0.905s user 0m0.902s sys 0m0.001s clang -O3
A64m
open Batteries let lns = IO.lines_of IO.stdin |> Enum.map (String.split_on_char ' ') |> Array.of_enum let ps = Array.map (fun (x::_) -> x) lns let ss = Array.map (fun (_::x::_) -> x) lns let () = ps |> Array.iter (fun p -> ss |> Array.iter (fun s -> IO.nwrite IO.stdout p; IO.write_line IO.stdout s )) но тут опять какой-то лишний перенос строки в конце или что-то вроде
A64m
$ ocamlbuild -r -use-ocamlfind -pkgs 'batteries' 'bso.native' -tag 'optimize(3)'
A64m
4.04.0+flambda
Anonymous
Попробуйте скопмилировать один и тот же .c-файл через gcc и g++ и сравнить производительность того, что та выходе. У меня в 2014 был кусок кода, который после g++ работал быстрее
Anonymous
Хотя, казалось бы
A64m
эффекта от оптимизатора незаметно
分解物質
какие там резервы по оптимизации ещё остались? в сишке
наверно можно попробовать с restrict поиграться, но у меня из-за этого пока только ухудшалось
Vadim
хотя понятно, что тут был сарказм
Я не эксперт, но может попробовать без батареек?
A64m
джейнстритовскими либами чтоли?
Denis
я тут подумал что джент-стрит это нормальное название для чего-нибудь про тяжмет
Alexander
offset_map.c у меня 0.98 моё 0.60
Alexander
-O3
分解物質
лучше достать какую-нибудь задачу поbynthtcytt, с какого нибудь advent of code
Alexander
лучше haskell доразогнать и либы дописать если надо
Alexander
просто в си играться не интересно
A64m
вообще не понимаю, как в на нем пишете, я читать себя не могу заставить
Алексей
А какие-то summary по всей этой специальной олимпиаде есть?
A64m
https://gist.github.com/voidlizard/c736e3d7fcd382c6f9904f8b653102b5#file-special-olympics-md
Vadim
Не - безо всего
A64m
этож окамл, там ничего юзабельного "без всего" нету
A64m
как и в хаскеле, собственно, если не хуже
A64m
но если заменить фвп на пару циклов а-ля фортран и почитать что-нибудь про ио, я думаю, можно еще что-то выжать, но это уж как-нибудь без меня
Alexander
кстати насчет более сложной программы
Alexander
сейчас си дошёл до очень интересного уровня
Alexander
я боюсь что дальнейшие улучшения это всякие хитрые системные интейрфейсы и кэш-френдлинес
Alexander
соотвественно если хочется этому учиться то пример может быть и не самый плохой
Alexander
но очень жалко времени
Anonymous
Кеш-френдли это можно сделать, если собрать данные одним куском и вместо строк накапливать смещения. Какой там размер у входных данных-то?
A64m
небольшой
A64m
и на окамле также можно сделать, кстати, там ио можно передавать слайс массива
Alexander
@kir я в си так делаю
Anonymous
И совать '\0' сразу после слова, а потом через strcpy собирать буфер.
Alexander
читаем вход в свой буффер с realloc, после этого собираем длины и смещения
Alexander
\0 не надо b strcopy не надо
Alexander
если есть длины и смещения то собираем через memmove или если знаем что строки короткие то вручную
Anonymous
strncpy?
Alexander
нет, это медленее
Alexander
strcpy проверяет на \0
Alexander
а мы это уже сделали
Anonymous
Да, я забыл про memmove
Alexander
вот, ещё один человек говорит про vmsplice!
Alexander
маловероятно что кто-то
Anonymous
Что дальше? FORTH? K? APL?
Lev
на куде?
Anonymous
J?
Lev
GPU shaders?
adam
J?
Его бы тоже стоило
adam
Еще R и APL
Alexander
а у кого есть практический опыт со сплайсами?
A64m
куда дальше-то где sml? опять чтоли мне писать?
Alexander
а то я все хотел попробовать но руки не доходили и задач не было
Anonymous
C SML падажжы, процесс идёт
Alexander
т.е. со сплайсами аллоцируем страницу дампим туда, потом vmsplice(stdout,page_size,1,SPLICE_F_GIFT)?
Alexander
а там можно даже много сегментов давать
Alexander
о, ваще!
Denis
а почему с vmsplice будет быстрее? Кернелогуру, расскажите.
Alexander
_поидее_ если там с gift то страница тупо отдается ядру
Alexander
и меньше копирований между буфферами и ядроспейсом
Alexander
может гуру честно расскажут
Anonymous
м
Anonymous
а если в ринг 0 запустить
Alexander
на практике я не знаю, ни разу не использовал
Alexander
splice() moves data between two file descriptors without copying between kernel address space and user address space. It transfers up to len bytes of data from the file descriptor fd_in to the file descriptor fd_out, where one of the file descriptors must refer to a pipe.
Alexander
вот что ман сплайса говорит
Denis
ну т.е. я по манпейджу понял что это такая ядерная оптимизация, которая запрещает приложению в этот кусок памяти писать, но зато для кернела делает магично быстрее
Alexander
да