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
пойду сделаю.
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
Давайте напишем zero allocation mailbox!
в гопаке уже написан
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
Vladislav
этот код работает ЕЛЕ-ЕЛЕ
Тебя там гуид не убил?
Ayrat
Ну мы все же не можем сделать zero allocation, без ожидания доступа :C
ну смотри, те кто хотят послать сообщение (например 5 воркеров) встают в очередь шедулера на рандеву с мейлбоксом. Когда мейлбокс будет готов, шедулер устраивает рандеву между джобой и мейлбоксом и передаются данные. Тут аллоцируется максимум 5 месаджей (по кол-ву воркеров) Если у нас нет рандеву, то 5 воркеров посылают сообщения без ожидания готовности мейлбокса и аллоцируется сообщений столько, сколько влезет в очередь мейлбокса
Ayrat
А покажи потом результаты
там будет примерно 0 аллокаций
Ayrat
не 0, но около того
Vladimir
Mailbox.take (и сразу же игнор)
а можешь сделать с интом например? а то не очень понятно куда хэндлер вставлять)
Ayrat
ну тип дропнуть?
Vladimir
ну да, или мб записать в мутабл переменную для примера, я просто не понимаю где хэндлер) надо же примеры сравнить нормальные когда ты что-то делаешь с сообщением хотя бы) или даже не делаешь, но хоть что-то на каждом степе вызывается
Ayrat
вот в функции fun someResult можешь чо хочешь делать с резалтом
Ayrat
я его вернул в том же виде (это юнит)
Vladimir
пасиб)
Vladimir
повлияло ли это на перф?
Ayrat
повлияло ли это на перф?
я не проверял. А почему должно?
Ayrat
я всё ещё жду акку!1
Vladimir
ну там инстансы юнита будут аллоцироваться по идее
Nikolay
я всё ещё жду акку!1
А попробуй вместо гуида инт в строку гнать
Vladimir
а хотя нет, это же синглтон)
Vladislav
Тема гопака возвращает во времена когда айрат ещё не продался за жабу и писал на фшарпе
Ayrat
но уже почти конец.
Nikolay
А попробуй вместо гуида инт в строку гнать
И просто прогнать в одном мейлбоксе 1кк
Vladimir
я просто мб могу переписать все мейлбоксы в пульсаре на гопак и будет прирост в скорости в 5 раз) хочу понять насколько это реально)
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
даже гуид не может так лажать
Vladimir
абсолютно реально, гопак внутри, а снаружи таски\асинки я так много раз делал
ну ты тут немного другое меряешь - миллион мейлбоксов) у меня их 10 всего, но каждый очень упорно работает) есть ли смысл в гопаке для этого кейса
Ayrat
надо мерять!
Vladislav
Кстати
Ayrat
ну вообще тут для верности надо смотреть и скорость обработки
Vladislav
Последнее упоминание гопака в пронете было 9 декабря
Ayrat
и я вангую тут гопак даст всем просраться