본문 바로가기

Programming/JavaScript tips

if(object[key] !== undefined) VS for(let key in object) VS Object.hasOwnProperty(key) : 누가 더 빠를까?

1. Time Complexity (시간 복잡도)

2. 누가 더 빠를까?

시간 복잡도를 검색하는데 흥미로운 질문을 발견했다. 

  " if(object[key] !== undefined) VS for(let key in object) VS Object.hasOwnProperty(key) "

쉽게 말해 O(1)과 O(n)과의 대결이다. 한번 보는게 낫기 때문에 테스트 사이트를 이용해 확인 할 수 있다.

아래 사이트는 몇년전에 만들어졌기 때문에 최신 브라우저의 성능을 기준으로 결과를 주진 않지만 어떤 방법이 더 빠르게 작동하는지 알 수 있다.

https://jsperf.com/double-lookup/4

 

Double Lookup · jsPerf

Test runner Warning! For accurate results, please disable Firebug before running the tests. (Why?) Java applet disabled. To run the tests, please enable JavaScript and reload the page. Testing in FacebookBot 1.1.0 / Other 0.0.0 Test Ops/sec Double-Get for

jsperf.com

관심이 갔던 이유는 O(1)의 시간 복잡도를 가진 알고리즘도 O(n)의 알고리즘보다 느리게 동작할 수도 있다는 것이다. 왜냐하면 시간 복잡도는 항상 동일한 데이터의 양과 동일한 환경에서만 구할 수 있는게 아니기 때문에 데이터의 양에 따라서 다양한 결과를 가져오기도 한다. 또한 브라우저의 엔진이나 컴퓨터의 사양에 따라서도 충분히 달라질 수 있다. 하지만 무엇보다도 그래프에서도 볼 수 있듯이 데이터의 양이 적을 때는 가장 빠르게 생각할 수 있는 O(1)보다 O(n)이나 심지어 O(Cn)이 더 빠르게 동작할 수도 있다.

 이러한 테스트에서도 알 수 있듯이 우리가 다룰 데이터의 양의 따라서 적당한(?) 방식으로 알고리즘을 풀어주면 좋다.