2012-08-30 1 views
3

필자는 (옵션 C에 표시된대로) 필자가 사전에 디버깅을 할 수있게하기 때문에 대개 B 옵션을 사용합니다. 그것은 또한 내 의견으로는 청결 해 보인다. 이것은 아마도 문제가되지 않을 수도 있지만 옵션 B 또는 C가 더 많은 메모리를 사용하는지 아니면 iOS 프로그래밍에서 이것을 수행 할 때 고려해야 할 다른 것이 있는지 궁금합니다. 그건 그렇고, 나는 ARC를 사용하고있다.Objective-C 중간 객체 최적화

옵션 B 또는 C 대신 옵션 A를 사용하면 장점이 있습니까?

// OPTION A 
NSString *someString = [[self grabDictionaryFromDB] objectForKey:@"someField"]; 

// OPTION B 
NSDictionary *dbRow = [self grabDictionaryFromDB]; // dbRow ONLY gets used in the next line 
NSString *someString = [dbRow objectForKey:@"someField"]; 

// OPTION C 
NSDictionary *dbRow = [self grabDictionaryFromDB]; // dbRow ONLY gets used in the next two lines 
NSLog(@"Row: %@", dbRow); 
NSString *someString = [dbRow objectForKey:@"someField"]; 
+0

[this] (http://stackoverflow.com/questions/12062162/does-an-auxiliary-variable-with-a-pointer-have-any-performance-memory-impact)를 참조하십시오. – Adam

+0

속도 테스트를 수행 했습니까? 내 생각에, 그 숫자는 당신에게 대답을 말할 수 있습니다 ... – holex

+0

@ 아담 감사합니다, 그것은 그것을 잘 설명합니다. 나는 dasblinken의 답변을 받아 들였는데, 시간을내어 쓰기 (그리고 나는 당신의 의견 앞에서 그것을 보았다)! holex, speed test는 아무런 의미있는 결과도 얻지 못했지만 메모리에 더 관심이있었습니다 (이 상황에서 메모리 사용을 테스트하는 방법을 알지 못합니다). – Julian

답변

2

기회는 옵션 A와 B는 컴파일러에 의해 정확히 동일한 출력에 최적화 될 것입니다, 그래서 당신은 옵션 B를 얻는 유일한 방법은 가독성이다. 옵션 C는 추가 상점 지침과 ARC의 [retain]/[release] 쌍을 필요로하지만 옵션 A 또는 B와 비교할 때 그 영향을 알아 채지 못할 것입니다.

+0

테스트하지는 않았지만 호가 보유되어 있지 않고 호가 출시되지 않아야합니다. 또한 ** 최적화 **로 컴파일하면 여분의 저장 명령이나 여분의 공간 사용이 없을 것입니다. 옵션 C에 대한 추가 레지스터 간 이동 명령이있을 수 있습니다. 주변 코드가 복잡하고 많은 변수를 사용하는 경우 옵션 C (로드, 저장하지 않음)에 대한 추가로드 명령어가있을 수 있습니다. 최적화없이 컴파일하면 (디버그 모드) 완전히 다른 이야기입니다. –

0

나는 옵션 B를 훨씬 쉽게 수정할 수 있기 때문에 제안합니다. 미래.

문제 1 : 해당 사전을 사용하여 다른 작업을 수행하려고합니다.

//Option A version 
NSString *someString = [[self grabDictionaryFromDB] objectForKey:@"someField"]; 
NSString *someOtherString = [[self grabDictionaryFromDB] objectForKey:@"someOtherField"]; 

//Option B version 
NSDictionary *myDictionary = [self grabDictionaryFromDB]; 
NSString *someString = [myDictionary objectForKey:@"someField"]; 
NSString *someOtherString = [myDictionary objectForKey:@"someOtherField"]; 

[self grabDictionaryFromDB]를 실행하는 데 시간이 오래 걸리면 어떻게됩니까? 갑자기 당신은 한번 대신 두 번 실행합니다. 반환 된 사전 포인터를 저장하고 한 번만 실행할 수 있습니다.

2 호 : 갑자기 다른 사전에 갑자기 액세스하고 싶다면 어떻게해야합니까? 위의 옵션을 사용하면 사전에 액세스 한 횟수에 관계없이 Option B에서 한 줄의 코드 만 변경하면됩니다. 옵션 B에서는 myDictionary의 값을 변경하기 만하면됩니다. 옵션 A에서는 일련의 코드 행을 변경해야합니다.

관련 문제