The problems with GC'd languages are very exaggerated. I'm not surprised at all that this is performant in C#.
I’m sure there are techniques to work around this, but you’d then usually have to leave behind the “idiomatic” area of the language you’re using.
https://devblogs.microsoft.com/dotnet/performance-improvemen...
Most notably:
> When running with the “Server GC”, a thread per core is involved in collections, and as threads finish their allotted portions of the marking work, they’re now able to “steal” undone work from other threads in order to help the overall collection complete more quickly.