[C#] null을 비교하기위한 여정3, ==과 is 그리고 Equals(,) 속도

2023. 1. 22. 15:57·STUDY/유니티

null 체크를 하기위해서 다양한 방법들을 알아보았습니다.

그러던 중 신기한 것을 발견하였죠.

 

바로 같은역할을 하는 친구들이 모두 속도가 다르단 것입니다!

is, Equals ,==

(ReferenceEquals의 경우에는 is와 속도가 거의 같아서 is로 대체하였습니다.)

 

테스트코드

테스트 코드

 void Start()
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        Test test1= TestClass1;

        for (int i=0;i<100000000;i++)
        {
            if ( test1 == null);
        }
        sw.Stop();

        UnityEngine.Debug.Log("Object == null : " + sw.Elapsed);
    }

일단 앞선 게시물에서 is가 ==보다는 왜 빠른지 알았습니다.

근데 Equals(object,object).. 이 친구는 ==보다는 빠른데, is보다는 느립니다..

어떤 원리일까요? 좀 더 안전하게 속도를 빨리 할 수 있는걸까요?

 


 

일단 FakeNull을 체크할 수 있는 지 확인해봅시다.

IEnumerator Start()
    {
        GameObject test = new GameObject();
        yield return null;


        Destroy(test);
        yield return null;

        Debug.Log("UnityEngine Null check : " + NullCheckUnityEngine(test));
        Debug.Log("System Null check : " + NullCheckSystem(test));
    }

    string NullCheckUnityEngine(Object obj)
    {
        if (obj == null)
            return "true";
        else
            return "false";            
    }
    string NullCheckSystem(object obj)
    {
        if (obj == null)
            return "true";
        else
            return "false";
    }

일단, ==은 fake null체크를 진행합니다. 그 결과 true, false로 나오죠.

 

 

Equals(,)의 경우에는 어떨까요?

IEnumerator Start()
    {
        GameObject test = new GameObject();
        yield return null;


        Destroy(test);
        yield return null;

        Debug.Log("UnityEngine Null check : " + NullCheckUnityEngine(test));
        Debug.Log("System Null check : " + NullCheckSystem(test));
    }

    string NullCheckUnityEngine(Object obj)
    {
        if (Equals(obj, null))
            return "true";
        else
            return "false";            
    }
    string NullCheckSystem(object obj)
    {
        if (Equals(obj, null))
            return "true";
        else
            return "false";
    }

이런.. fake null까지 체크하진 않군요.

 

실제 찾아보니 ==의 경우에는 UnityEngine.Object와 정의가 연결되어 있고

Equals나 ReferenceEquals 등 fakenull 을 체크하지 않는 친구들은 System.Object에 정의되어있습니다.

 

Equals(object, null)같은 경우는 fakenull을 체크하지 않아 연산에서 좀 더 시간이 빠르단걸 알게되었습니다.

그럼 왜 is나 ReferenceEquals보다는 느린걸까요??

 


둘다 시스템 상 null만 체크하는건 동일하지만

 Reference.Equals(object, object)의 경우에는 두 개체의 참조만을 비교합니다.

참조만을 비교하니 서로 가리키는 것이 무엇인지만 파악하면 되기에 속도가 빠른것같습니다.

 

object is null의 경우에는 상수 또는 Null만을 비교함으로써

두가지의 경우만 있기에 좀 더 속도가 빠르게 진행되는것같습니다.

 

Equals(object,null) 의 경우에는 두개의 값 모두 null인지를 먼저 체크 한 다음에 값의 비교를 진행합니다

null인지도 체크하고, 그 다음에 값이 같은지까지 체크하니 좀 더 속도가 걸리는것같습니다.

 

그래서 결론적으로 속도차이는

object.Reference.Equals(object,null) = object is null  >  Equals(object,null)  >  object == null

이렇게 결론이 나게됩니다.

 

 

자세한 함수의 코드는 잘 모르지만 나와있는 문서의 정보라던가 사람들의 이야기를 들어보고 정리한 결과,

해당 함수가 어떤 기능을 수행하는지를 알게되어 속도가 왜 차이가 나는지에 대해서도 어느정도 이해가 되었습니다. 

 

하지만 무조건 제 말이 옳은건 아닙니다.

저도 단지 원리를 보고 파악하는것이기때문에 피드백이 있다면 언제든지 환영입니다!

 

이걸로 null에 대한 여정 끝!  

 

 

참고자료

https://stackoverflow.com/questions/34895925/difference-between-object-equalsobject-object-and-object-referenceequalsobjec

 

difference between Object.Equals(object,object) and Object.ReferenceEquals(object,object) in c#

I have asked by an Interviewer in an Interview that "difference between Object.Equals(object,object) and Object.ReferenceEquals(object,object)". I have tried in code snippet but the result is same.

stackoverflow.com

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/is

 

'is' 연산자 - 식과 형식 또는 상수 패턴 일치

패턴에 대한 식과 일치하는 C# 'is' 연산자에 대해 알아봅니다. 식이 패턴과 일치하면 'is' 연산자는 true를 반환합니다.

learn.microsoft.com

 

'STUDY > 유니티' 카테고리의 다른 글

모바일을 위해 유니티 빌드 용량 줄이기_POT,폰트  (2) 2025.01.21
[C#] null을 비교하기위한 여정2, is 와 FakeNull  (0) 2023.01.21
[C#] null을 비교하기위한 여정1, ==와 Equals()  (0) 2023.01.18
[Unity] 메지카복셀에서 내가 만든 캐릭터 유니티로 불러오기  (0) 2022.09.10
[Unity] C# 문자열보간  (0) 2022.08.02
'STUDY/유니티' 카테고리의 다른 글
  • 모바일을 위해 유니티 빌드 용량 줄이기_POT,폰트
  • [C#] null을 비교하기위한 여정2, is 와 FakeNull
  • [C#] null을 비교하기위한 여정1, ==와 Equals()
  • [Unity] 메지카복셀에서 내가 만든 캐릭터 유니티로 불러오기
wise_
wise_
  • wise_
    WHY'S BlOG
    wise_
  • 전체
    오늘
    어제
    • 분류 전체보기 (63)
      • PROJECT (19)
        • 젯슨나노 프로젝트 (0)
        • 유니티 (9)
      • STUDY (37)
        • 코딩문제 (13)
        • 알고리즘 (0)
        • Effective C++ (14)
        • 유니티 (8)
        • 언리얼 (2)
      • ERROR (7)
        • 오류덩어리들 (7)
      • REVIEW (0)
      • LIFE (0)
        • 작고 소중한 내 일상 (0)
        • 작고 귀여운 내 취미 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    힐링게임
    퍼즐게임
    개발일지
    여우는오늘도친구를구한다
    c#
    TheFoxSeeksFriend
    unity
    모바일게임
    유니티
    알고리즘
    플로이드와샬
    코딩
    귀여운
    힐링
    스마일게이트
    게임개발
    언리얼
    ==
    개발
    와이즌
    윈터데브캠프
    null
    게임
    1인개발
    error
    wisen
    인디게임
    깊이우선탐색
    C++
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
wise_
[C#] null을 비교하기위한 여정3, ==과 is 그리고 Equals(,) 속도
상단으로

티스토리툴바