본문 바로가기
회사

성능개선 동등비교 정리

by 개발고구마 2024. 7. 29.

성능개선하다 궁금한 점 생겨 찾아본 내용을 공유

먼저 성능개선 조건을 다음과 같이 받았다(메서드명과 변수명은 임의지정)

회사 자체적으로 만든 equals를 쓸 때
위처럼 사용하게 되면 이중 반복문이 되어 성능에 영향을 미친다고 아래 방식으로 변경이 필요했다

AS-IS

foreach{
	if(isEquals(data, ['A', 'B', 'C', 'D']){
		//doSomething
	}
}

TO-BE

set = new Set(['A', 'B', 'C', 'D'])

foreach{
	if(set.has(data)){
		//doSomething
	}
}

일단 equals가 비교대상목록이 배열로 들어오면 순회하면서 찾는다는걸 알기에 비 효율적인게 맞아 수정 먼저 했다
위 소스를 고쳐놓고 "여러개 비교를 할 경우에는 set으로 바꿨지만 2개를 비교할 때는 굳이 set으로 만들어야 하나?" 싶어 의문점이 들었다

or(||) 처리가 나을까 set이 나을까?

먼저 간단하게 chatGPT한테 물어봤다

돌려보라고 친절하게 소스도 주니 돌려봤다

결과


60ms 로 미세한 차이가 났는데 이것도 100만번을 돌려본거니 10만번에 6ms로 차이가 거의 없다고 볼 수 있다

리스트로 돌리게 되면 당연히 O(N)의 성능이 나오니 비교 대상에서 당연히 제외했다

 

이렇게 확인하고 또 다른게 궁금해졌다
isEquals를 하나씩 비교하는 소스들이 꽤 많아 단순 비교 연산자랑 뭐가 다른지, 성능에는 어떤 영향을 끼칠 지 궁금해서 회사 내부 소스를 분석해봤다
확인해보니 C#의 string.Compare를 사용해 비교하고 있었다

string.Compare?

 

그래서 C#의 string.Compare 구현이 궁금해 확인하면서 MS의 원문을 확인해봤다

설명 : https://learn.microsoft.com/ko-kr/dotnet/api/system.string.compare?view=net-8.0
소스 : https://github.com/dotnet/runtime/blob/5535e31a712343a63f5d7d796cd874e563e5ac14/src/libraries/System.Private.CoreLib/src/System/String.Comparison.cs#L210C13-L211C56

 

string.Compare는 대소문자 구분을 체크할지 말지 판단하는 파라미터까지 받아 문자열을 비교하도록 했다

그 내부로 들어가보니 결국 비고는 동등 비교를 하고 있었다

그럼 동등 비교는 결국 같다는거고 그럼 회사 메서드와 동등 비교 연산자를 사용할 때 아래 값들의 결과는 어떻게 될지가 궁금해졌다

undefined , null , ''

비교할 값이 다음과 같을 때 문제가 어떻게 될까?

값이 undefined 일 때 , null 일 때, 빈 값일 때

결론은 "셋 다 에러는 안난다" 이다

비교연산자나 isEquals를 사용하는데 둘 다 에러가 안나니 차이가 없다(당연히 undefined와 null 결과는 false)

그럼 회사가 구현한 isEquals는 언제쓰는게 좋을까?

대소문자 관련된 해결이 필요할 때 쓰면 될 것 같다
simple이란 단어가 들어올 때 무언가 해야한다면
단순 비교연산자는 simple이 들어올때는 true 지만 Simple 이 들어오거나 SIMPLE이 들어오면 false로 판단한다
하지만 isEquals는 대소문자 구분 파라미터를 따로 받아 해당 구분을 false로 주면 모두 같다는 결과를 준다

이로써 개선하면서 궁금했던 점들을 소스 내부를 모두 확인하고 나서야 모두 해답을 얻었다