Test case: 1000 GameObject with 10 components on each, so total of 10.000 update calls
With update manager: 0.3ms - 0.4ms
Without update manager: 4.4-5.2ms
With update manager checking if gameobject is active before ticking (which doesnt make sense to check like this, but still i wanted to test )
for (int i = 0; i < _tickables.Length; i++) {
if (_tickables[i].gameObject.activeSelf == false) continue;
_tickables[i].Tick();
}
But even this around 1.5 to 1.7ms
And last test with coroutine 10.2 / 10.4ms so this is the slowest
using System.Collections;
using UnityEngine;
public class MonoWithCoroutineUpdate : MonoBehaviour {
IEnumerator Start() {
while (true) {
{
Tick();
yield return null;
}
}
}
void Tick() {
}
}
Test code
using System.Collections.Generic;
using UnityEngine;
public sealed class Spawner : MonoBehaviour {
[SerializeField] int spawnCount = 200;
[SerializeField] GameObject prefab;
MonoWithListUpdate[] _tickables;
void Start() {
var list = new List<MonoWithListUpdate>();
for (var i = 0; i < spawnCount; i++) {
var instance = Instantiate(prefab);
list.AddRange(instance.GetComponents<MonoWithListUpdate>());
}
_tickables = list.ToArray();
}
void Update() {
for (int i = 0; i < _tickables.Length; i++) {
_tickables[i].Tick();
}
}
}
public class MonoWithUpdate : MonoBehaviour
{
int i = 0;
void Update()
{
}
}
public class MonoWithListUpdate : MonoBehaviour {
public void Tick() {
}
}
So updatemanager is far way more performant then writing update inside classes.
Im not the first who is making this test also other tests showed similar result.
So i wonder why unitys way is slow and why they dont fix it. Why they dont use array loop like in my example what is the reason can somebody explain me please, thank you



