Description
Description
Calling Marshal.AllocHGlobal / Marshal.FreeHGlobal is ~150x slower in .NET compared to legacy Mono when running on a tvOS device.
Sample test code: https://gist.github.com/rolfbjarne/b22b844e6f351ad40c4f30e20a2a36d8
Outputs something like this with legacy Mono (Xamarin.iOS from d16-10):
[...]
Elapsed: 17.03 seconds Counter: 265,779,440.00 Iterations per second: 15,608,870
Elapsed: 18.03 seconds Counter: 281,406,670.00 Iterations per second: 15,608,886
Elapsed: 19.03 seconds Counter: 297,098,501.00 Iterations per second: 15,612,343
which is roughly 15.5M calls to Marshal.AllocHGlobal+FreeHGlobal per second.
Now in .NET I get this:
[...]
Elapsed: 17.10 seconds Counter: 1,773,883.00 Iterations per second: 103,745
Elapsed: 18.10 seconds Counter: 1,878,446.00 Iterations per second: 103,784
Elapsed: 19.10 seconds Counter: 1,982,100.00 Iterations per second: 103,771
that's roughly 103k calls to Marshal.AllocHGlobal+FreeHGlobal per second; ~150x slower.
This is on an Apple TV 4K from 2017.
There's a difference in the simulator too, just not so stark (on an iMac Pro)
Legacy Mono:
[...]
Elapsed: 12.02 seconds Counter: 165,442,863.00 Iterations per second: 13,759,790
Elapsed: 13.02 seconds Counter: 179,568,197.00 Iterations per second: 13,787,606
Elapsed: 14.02 seconds Counter: 193,717,056.00 Iterations per second: 13,812,942
and with .NET:
[...]
Elapsed: 12.03 seconds Counter: 39,917,875.00 Iterations per second: 3,317,120
Elapsed: 13.03 seconds Counter: 43,252,347.00 Iterations per second: 3,318,392
Elapsed: 14.04 seconds Counter: 46,617,318.00 Iterations per second: 3,321,424
so ~4x slower.
I profiled the .NET version on device using instruments:
Marshal.trace.zip
Here's a preview:
It seems most of the time is spent inside mono_threads_enter_gc_safe_region_unbalanced
.
This function isn't even called in legacy Mono.
Here's an Instruments trace:
MarshalMono.trace.zip
and a preview:
I don't know if this applies to other platforms as well, I only tested tvOS.
Metadata
Assignees
Labels
Type
Projects
Status
No status