Unity/Tip

Unity에서 게임 오브젝트의 Null 체크 속도 비교

코샵 2023. 10. 30. 15:53
반응형

Unity 개발을 하다 보면 게임 오브젝트의 Null 체크를 자주 사용하게 됩니다. 게임 오브젝트가 Null인지 확인하기 위해 is 연산자와 == 연산자를 사용할 수 있습니다.

 

is 연산자와 == 연산자의 차이점

is 연산자는 객체의 참조 값이 Null인지 확인합니다. == 연산자는 객체의 값이 Null인지 확인합니다.

 

is 연산자의 장점

  • == 연산자보다 빠르다.
  • 객체의 값이 Null인지 확인하지 않는다.

== 연산자의 장점

  • is 연산자보다 간결하다.
  • 객체의 값이 Null인지 확인할 수 있다.

JetBrain Rider의 제안

최근 필자는 IDE를 VSCode에서 JetBrain Rider로 바꾸었다.  Rider에서는 다음과 같은 제안을 했다.

Comparison to 'null' is expensive. 

Null에 대한 비교는 많은 비용이 들어간다고 해 관련 내용을 찾아 테스트를 진행해보았다.

 

테스트 결과

테스트 코드를 작성하여 is 연산자와 == 연산자의 속도를 비교해 보았습니다.

public class Test : MonoBehaviour
{
    public GameObject prefab;

    private IEnumerator Start ( )
    {
        var go = Instantiate(prefab);
        Destroy(go);
        Debug.Log ( $"go is null: {go is null}. go == null: {go == null}." ); // False False.
        yield return null;
        Debug.Log ( $"go is null: {go is null}. go == null {go == null}." ); // False True.
        yield return null; 

        var sw = new Stopwatch();
        sw.Start ( );
        for ( var i = 0; i < 10_000_000; ++i )
            _ = go is null;
        sw.Stop ( );
        Debug.Log ( $"go is null: {sw.ElapsedMilliseconds} ms" ); // Test machine : ~10 ms

        sw.Reset ( );

        sw.Start ( );
        for ( var i = 0; i < 10_000_000; ++i )
            _ = go == null;
        sw.Stop ( );
        Debug.Log ( $"go == null: {sw.ElapsedMilliseconds} ms" ); // Test machine : ~4000 ms

        yield return null;
        Debug.Log ( $"go is null: {go is null}. go == null {go == null}." ); // STILL False True.

#if UNITY_EDITOR
        EditorApplication.ExitPlaymode ( );
#endif
    }
}

테스트 결과, is 연산자는 == 연산자보다 약 400배 빠른 것으로 나타났습니다.

실제 프로젝트에서 is 연산자와 == 연산자의 속도 차이는    있습니다. 이는 게임 오브젝트의 수가 많을수록 is 연산자가  빠르기 때문입니다.

 

결론

Unity에서 게임 오브젝트의 Null 체크를 할 때는 is 연산자를 사용하는 것이 좋습니다. is 연산자는 == 연산자보다 빠르고, 객체의 값이 Null인지 확인하지 않기 때문입니다.