Мой друг Aras недавно написал один и тот же трассировщик лучей на разных языках, в том числе на C++, C# и компиляторе Unity Burst. Разумеется, естественно ожидать, что C# будет медленнее, чем C++, но мне показалось интересным, что Mono настолько медленнее .NET Core.
Опубликованные им показатели были плохими:
- C# (.NET Core): Mac 17.5 Mray/s,
- C# (Unity, Mono): Mac 4.6 Mray/s,
- C# (Unity, IL2CPP): Mac 17.1 Mray/s
Я решил посмотреть, что происходит, и задокументировать места, которые можно улучшить.
В результате этого бенчмарка и изучения этой проблемы мы обнаружили три области, в которых возможно улучшение:
- Во-первых, необходимо улучшить параметры Mono по умолчанию, потому что пользователи обычно не настраивают параметры у себя
- Во-вторых, нам нужно активнее знакомить мир с бекэндом оптимизации кода LLVM в Mono
- В-третьих, мы улучшили настройку некоторых параметров Mono.
Опорной точкой этого теста были результаты прогона трассировщика лучей на моей машине, а поскольку железо у меня другое, сравнивать числа мы не можем.
Результаты на моём домашнем iMac для Mono и .NET Core были следующими:
Рабочая среда | Результаты, MRay/sec |
---|---|
.NET Core 2.1.4, отладочная сборка dotnet run |
3.6 |
.NET Core 2.1.4, релизная сборка dotnet run -c Release |
21.7 |
Ванильный Mono, mono Maths.exe |
6.6 |
Ванильный Mono с LLVM и float32 | 15.5 |