Skip to content

Instantly share code, notes, and snippets.

@Szer
Created May 23, 2020 10:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Szer/61edbbf0185a5f6d974ccdff309f52ce to your computer and use it in GitHub Desktop.
Save Szer/61edbbf0185a5f6d974ccdff309f52ce to your computer and use it in GitHub Desktop.
Benchmark of memory footproing on sending myriad of messages to myriad of actors
module Bench
open System
open BenchmarkDotNet.Attributes
open BenchmarkDotNet.Running
open Hopac
open Hopac.Infixes
open Akka.FSharp
[<SimpleJob(launchCount = 3, warmupCount = 3, targetCount = 5)>]
[<GcServer(true)>]
[<MemoryDiagnoser>]
[<MarkdownExporterAttribute.GitHub>]
type Benchmarks () =
[<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 -> Hopac.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
[<Benchmark>]
member this.AkkaMb () =
let system = System.create "my-system" (Configuration.load())
let newActor i =
spawn system (string i)
(fun mailbox ->
let rec loop() = actor {
let! _ = mailbox.Receive()
return! loop()
}
loop())
let actors = [| for i in 1..100_000 -> newActor i |]
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)
[<EntryPoint>]
let main _ =
let _ = BenchmarkRunner.Run<Benchmarks>()
0

// * Summary *

BenchmarkDotNet=v0.12.0, OS=macOS 10.15.4 (19E287) [Darwin 19.4.0] Intel Core i9-9880H CPU 2.30GHz, 1 CPU, 16 logical and 8 physical cores .NET Core SDK=3.1.201 [Host] : .NET Core 3.1.3 (CoreCLR 4.700.20.11803, CoreFX 4.700.20.12001), X64 RyuJIT DEBUG Job-ZIGDUG : .NET Core 3.1.3 (CoreCLR 4.700.20.11803, CoreFX 4.700.20.12001), X64 RyuJIT

Server=True IterationCount=5 LaunchCount=3
WarmupCount=3

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
@delneg
Copy link

delneg commented Dec 14, 2020

// * Summary *

BenchmarkDotNet=v0.12.1, OS=Windows 10.0.14393.2248 (1607/AnniversaryUpdate/Redstone1)
AMD Ryzen 7 3800X, 1 CPU, 16 logical and 8 physical cores
Frequency=3808597 Hz, Resolution=262.5639 ns, Timer=TSC
.NET Core SDK=5.0.101
[Host] : .NET Core 5.0.1 (CoreCLR 5.0.120.57516, CoreFX 5.0.120.57516), X64 RyuJIT DEBUG
Job-AQKFGX : .NET Core 5.0.1 (CoreCLR 5.0.120.57516, CoreFX 5.0.120.57516), X64 RyuJIT

Server=True

Method Mean Error StdDev Gen 0 Gen 1 Gen 2 Allocated
FSharpMb 1,415.8 ms 27.03 ms 28.92 ms 1000.0000 - - 990 MB
HopacMb 685.1 ms 34.93 ms 101.35 ms - - - 89.74 MB
AkkaMb 17,464.4 ms 177.14 ms 147.92 ms 2000.0000 1000.0000 - 3133.38 MB

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment