Ayrat
в обоих случаях
Ayrat
[<Benchmark>]
member this.FSharpMb () =
let rec loop (inbox: MailboxProcessor<unit>) = async {
do! inbox.Receive()
return! loop inbox
}
let processors = [| for _ in 1..100_000 -> MailboxProcessor.Start loop |]
let msgCount = 1_000_000
let random = Random msgCount
for i=0 to msgCount do
let t = random.Next(0, 100_000 - 1)
let mb = processors.[t]
mb.Post(())
[<Benchmark>]
member this.HopacMb () =
let loop = Mailbox.take >> Job.foreverServer >> start
let processors = [| for _ in 1..100_000 -> Mailbox() |]
Array.iter loop processors
let msgCount = 1_000_000
let random = Random msgCount
for i=0 to msgCount do
let t = random.Next(0, 100_000 - 1)
let mb = processors.[t]
Mailbox.send mb ()
|> start
Ayrat
и ни одного гопаковского оператора
Ayrat
а мог, мог
Ayrat
Mailbox.send заменяется на оператор!!11
Ayrat
надо ещё акку для верности
Ayrat
пойду сделаю.
Nikolay
Vladislav
Vladislav
Или он умер уже?
Ayrat
хз
Ayrat
не следил с момента как услышал о нём
Nikolay
Короче сделал бенч с одним мейлбоксом и 1 млн сообщений, сожрало больше 200 мб
Vladislav
А гопак
Nikolay
68 мб
Ayrat
ну 1 млн сообщений и 68мб это сойдёт
Ayrat
они ж все в любом случае на хипе оказываются. их трудно передать без аллокации
Ayrat
но если пользоваться ченелами, то можно.
Nikolay
Ну да, где-то держать их надо
Ayrat
не посылать сообщение пока ченел не готов принять новый месадж
Nikolay
Мм
Ayrat
и будет около нуля аллокаций
Ayrat
в твоём бенче ты посылаешь весь миллион разом. И да, их надо где-то хранить
Nikolay
Давайте напишем zero allocation mailbox!
Ayrat
но можно ж подождать и флудить на хип
Ayrat
Ayrat
он аллоцирует себя и пространство для одного сообщения
Ayrat
короче, акка сдохла нахуй. или я чот в акке перестал понимать.
Ayrat
member this.AkkaMb () =
let system = System.create "my-system" (Configuration.load())
let newActor() =
spawn system (string <| Guid.NewGuid())
(fun mailbox ->
let rec loop() = actor {
let! _ = mailbox.Receive()
return! loop()
}
loop())
let actors = [| for _ in 1..100_000 -> newActor() |]
let msgCount = 1_000_000
let random = Random msgCount
for i=0 to msgCount do
let t = random.Next(0, 100_000 - 1)
let actor = actors.[t]
actor.Tell (t, null)
Ayrat
этот код работает ЕЛЕ-ЕЛЕ
Nikolay
Еле еле это как?
Nikolay
Давай бэнч
Ayrat
я ещё не дождался его окончания
Nikolay
lol
Ayrat
я думаю я чот не так сделал, я спавнил дохуя акторов в акке
Ayrat
но гопак всё равно быстрее, да
Ayrat
будет
Nikolay
Ну мы все же не можем сделать zero allocation, без ожидания доступа :C
Vladimir
Vladislav
Ayrat
Ну мы все же не можем сделать zero allocation, без ожидания доступа :C
ну смотри, те кто хотят послать сообщение (например 5 воркеров) встают в очередь шедулера на рандеву с мейлбоксом. Когда мейлбокс будет готов, шедулер устраивает рандеву между джобой и мейлбоксом и передаются данные.
Тут аллоцируется максимум 5 месаджей (по кол-ву воркеров)
Если у нас нет рандеву, то 5 воркеров посылают сообщения без ожидания готовности мейлбокса и аллоцируется сообщений столько, сколько влезет в очередь мейлбокса
Ayrat
Ayrat
Nikolay
Ayrat
не 0, но около того
Ayrat
Ayrat
ну тип дропнуть?
Nikolay
Vladimir
ну да, или мб записать в мутабл переменную для примера, я просто не понимаю где хэндлер) надо же примеры сравнить нормальные когда ты что-то делаешь с сообщением хотя бы) или даже не делаешь, но хоть что-то на каждом степе вызывается
Ayrat
Ayrat
вот в функции fun someResult можешь чо хочешь делать с резалтом
Ayrat
я его вернул в том же виде (это юнит)
Vladimir
пасиб)
Vladimir
повлияло ли это на перф?
Ayrat
я всё ещё жду акку!1
Vladimir
ну там инстансы юнита будут аллоцироваться по идее
Vladimir
а хотя нет, это же синглтон)
Ayrat
Vladislav
Тема гопака возвращает во времена когда айрат ещё не продался за жабу и писал на фшарпе
Ayrat
Ayrat
но уже почти конец.
Nikolay
Vladimir
я просто мб могу переписать все мейлбоксы в пульсаре на гопак и будет прирост в скорости в 5 раз) хочу понять насколько это реально)
Ayrat
Ayrat
Результаты акки
| Method | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated |
|--------- |---------:|---------:|---------:|----------:|----------:|----------:|-----------:|
| FSharpMb | 1.368 s | 0.0531 s | 0.0497 s | 1000.0000 | - | - | 992.29 MB |
| HopacMb | 1.314 s | 0.1008 s | 0.0943 s | - | - | - | 89.74 MB |
| AkkaMb | 23.909 s | 1.5876 s | 1.4851 s | 7000.0000 | 3000.0000 | 1000.0000 | 3027.11 MB |
Ayrat
я хз где я навафлил
Ayrat
даже гуид не может так лажать
Vladislav
Ayrat
Ayrat
надо мерять!
Nikolay
Vladislav
Кстати
Ayrat
ну вообще тут для верности надо смотреть и скорость обработки
Vladislav
Последнее упоминание гопака в пронете было 9 декабря
Ayrat
и я вангую тут гопак даст всем просраться