habib
ну, в первую очередь спорили про динамическую типизацию
habib
так вот он может выдавать очень оптимальный машинный код
Doge
Doge
habib
ну, он в том числе фп
habib
очень даже
habib
два срача в одном: динамика против статики, и что считать фп, а что нет)))
habib
а по каким признакам это определяется?
habib
а кто мешает иммутабельные структуры использовать
x
habib
если сделать упор на иммутабельность в приложение, то она будет, если не заморачиваться - то, соотвественно, нет
habib
habib
steelbank common lisp
habib
я про него конкретно
Doge
x
почему называются тогда lua scripts
habib
x
ну я хз, что там сливает типизированным языкам
x
наверное скрипты, ну то не диво
KLH
у некоторых дин тип языков маленький рантайм. маленкьий рантайм хорошо помещается в кешах проца. оттого бывает быстрее на некоторых бенчах. об этом говорил дед видимо.
Igor
что-то мне кажется оно всё несколько по другому. Вот например нужно вызвать метод какого-то объекта. В статически типизированном языке почти всегда сразу известен адрес кода который нужно выполнить, а в динамически типизированном его еще нужно найти в рантайме
Bonart
Bonart
Гибкость имеет свою цену
J. A. R. Kotlien
Igor
Кек https://skillbox.ru/media/code/chto_vybrat_novichku_c_ili_f/
KLH
Bonart
KLH
конечно. я вообще начал уточнять только потому что видел бенчи. и был удивлен. а так да, среднестатистически не равны не в пользу динамики
J. A. R. Kotlien
Nikolay
Как ReadOnlySequence.Slice записать в Memory/Span?
Nikolay
🤔
Vasily
@dolfik, а что ты пишешь?
Nikolay
Сокет сервер
Nikolay
На пайпах и вот этом вот всём
Vasily
Короче
Vasily
Берешь буфер
Vasily
let receive() =
async {
do! Async.SwitchToThreadPool()
match getState() with
| Connected c ->
try
let reader = c.Input
match! (read reader) with
| Ok result ->
let buf=result.Buffer
if(buf.Length > 0L) then
let length = 4L + (result.Buffer.Slice(0,4).ToArray()|>Seg|>toInt|>fst|>int64)
// trace<| sprintf "buffer size %i ,expected length %i" buf.Length length
if (length <= result.Buffer.Length) then
trace<| sprintf "Message received. Length=%i" length
parse (result.Buffer.Slice(0L,length).ToArray()|>Seg)|>Async.Start
reader.AdvanceTo(result.Buffer.GetPosition(length))
else
reader.AdvanceTo(result.Buffer.Start)
| Error exn ->
trace exn.Message
trace exn.StackTrace
setState Disconnected
with exn->
trace exn.StackTrace
trace exn.Message
setState Disconnected
|_ -> ()
}
Vasily
Код из реального проекта
Vladimir
Вот самое лучшее что я нашел =)
Vladimir
ToArray это экстеншн метод
Nikolay
Вот мне что-то ToArray не нравится
Vladimir
ну ридонли сиквенс это не массив, а массив массивов)
Ayrat
Ayrat
Vasily
Только надо помнить про волшебный параметр resumeWriterTreshold
Vasily
В пайпах
Vasily
Он по умолчанию 32к
Vasily
Я себе так ногу отстрелил
Vasily
Ayrat
Ayrat
Дичь какая
Ayrat
Vasily
Vasily
Дольфик
Vasily
Посмотри еще на ArrayPool.Shared
Nikolay
Я предположил так, что он просто укажет на кусок в памяти
Vladimir
В память между тредами?
ну да, так надо скопировать чтобы стримерами читать, а если бы стримеры могли читать сразу из ReadOnlySequence было бы без копирования
Nikolay
Хочется сделать zero alloc
Nikolay
Ayrat
У вас читатель из сокета - обычно отдельный тред. Если вы читаете из консумера - вы не очень.
Пошарить результат чтения с консумером через стек читателя невозможно.
Но можно через стек консумера (стакаллок перед полингом и через аут параметр отдаем в консумера)
Или через хип
Vladimir
Igor
@neftedollar я же покекать принес
Vladimir
Ayrat
Ayrat
Короче, лучше аррэйПул да
Igor