Да, IL2CPP до сих пор медленнее MONO в общих случаях, хотя ситуация постепенно улучшается. Мы можем как-то улучшить производительность прямо сейчас?
Частично, да. Официальная документация говорит, что мы можем отключить часть внутренних проверок для генерируемого IL2CPP нейтивного кода. Давайте проверим потенциал данных улучшений на LeoECS фреймворке.
using System.Collections; using UnityEngine; namespaceLeopotamGroup.Ecs.Tests { classTest8 : MonoBehaviour, IEcsInitSystem { classC8_1 { } classC8_2 { }
EcsWorld _world = null;
IEnumerator Start () { yieldreturnnewWaitForSeconds (2f); var systems = new EcsSystems (new EcsWorld ()).Add (this); systems.Initialize (); systems.Destroy (); }
void IEcsInitSystem.Initialize () { constint TESTS = 40; constint T = 10000000; var sw = new System.Diagnostics.Stopwatch (); var result = 0; var entity = _world.CreateEntity (); _world.AddComponent<C8_1> (entity); _world.AddComponent<C8_2> (entity); _world.ProcessDelayedUpdates ();
for (var test = 0; test < TESTS; test++) { sw.Reset (); sw.Start (); for (var i = 0; i < T; i++) { _world.GetComponent<C8_1> (entity); _world.GetComponent<C8_2> (entity); } sw.Stop (); result += sw.Elapsed.Milliseconds; } Debug.LogFormat ("GetComponent: {0}", result / (float) TESTS); }
void IEcsInitSystem.Destroy () { } } }
Код теста (с IL2CPP-оптимизацией)
Отличие от предыдущего кода одно - наличие атрибута Il2CppSetOption на классе (и всех внутренних классах LeoECS фреймворка):
IEnumerator Start () { yieldreturnnewWaitForSeconds (2f); var systems = new EcsSystems (new EcsWorld ()).Add (this); systems.Initialize (); systems.Destroy (); }
void IEcsInitSystem.Initialize () { constint TESTS = 40; constint T = 10000000; var sw = new System.Diagnostics.Stopwatch (); var result = 0; var entity = _world.CreateEntity (); _world.AddComponent<C8_1> (entity); _world.AddComponent<C8_2> (entity); _world.ProcessDelayedUpdates ();
for (var test = 0; test < TESTS; test++) { sw.Reset (); sw.Start (); for (var i = 0; i < T; i++) { _world.GetComponent<C8_1> (entity); _world.GetComponent<C8_2> (entity); } sw.Stop (); result += sw.Elapsed.Milliseconds; } Debug.LogFormat ("GetComponent: {0}", result / (float) TESTS); }
void IEcsInitSystem.Destroy () { } } }
Результаты
MONO: 168ms
IL2CPP без оптимизаций: 293ms
IL2CPP с оптимизацией: 194ms
Результаты показывают неплохое ускорение (порядка 30%), но IL2CPP все еще медленнее, чем MONO.