NSDictionary에 특정 키가 포함되어 있는지 확인하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/831528

  •  06-07-2019
  •  | 
  •  

문제

NSDictionary에서 열쇠의 존재를 두 가지 방법으로 테스트 할 수 있습니다.

BOOL containsKey = [[dictionary allKeys] containsObject:foo];

BOOL containsKey = ([dictionary objectForKey:foo] != nil);

어떤 방법이 더 빠르며 그 이유는 무엇입니까?

도움이 되었습니까?

해결책

해시 조회는 모든 사전 키를 넘어서서 배열을 생성 한 다음 (메모리 할당이 비교적 비싸다는 것) 배열을 검색하는 것보다 일반적으로 더 빠릅니다. 배열을 검색합니다 (배열이 정렬되지 않기 때문에 이진 검색조차 할 수 없습니다). .

그러나 과학을 위해, 나는 각 스타일을 1 백만 번 실행하고 시간을 정한 두 가지 실행 파이브를 만들었습니다.

AllKeys와 함께 :

real    0m4.185s
user    0m3.890s
sys     0m0.252s

ObjectforKey와 함께 :

real    0m0.396s
user    0m0.189s
sys     0m0.029s

분명히, 다양한 요인이 사전 크기, Allkeys 리턴 값을 캐싱하는 등에 영향을 줄 수 있습니다. 그러나 배열 검색이 사전 조회보다 빠른 경우가있을 것으로 기대하지 않습니다.

다른 팁

AllKeys 배열을 요구하는 방법이 더 빠를 수있는 방법을 모르겠습니다. 그렇지 않으면 NSDictionary는 적어도 내부적으로 동등한 일을 할 것입니다.

편집 : 나는 당신이 allKeys 메소드가 더 빠를 것입니다 - 키에서 오랜 시간을 보낼 수 있습니다. hash 방법, 그러나 당신의 방법은 아닙니다 isEqual: 예를 들어 방법. 그리고 당신은 또한 미친 구현에서 교환 할 수 있습니다. NSDictionary 그것에 그들은 또한 교환됩니다 (이후 NSDictionary 초록입니다.)

이와 같은 성능 질문에 대해 생각할 때 Foundation 데이터 클래스는 저장 한 객체 수에 따라 기본 데이터 구조를 교체합니다. 예를 들어, 작은 nsarray는 실제로 특정 크기에 도달 할 때까지 저장에 해시 테이블을 사용한다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top