2010-03-13 2 views
2

Objective-C에서 핸들러 (델리게이트 등)를 호출하는 것이 C++에서 가상 함수를 호출하는 것보다 훨씬 빠르다는 이야기를 들었습니다. 정말 맞습니까? 그렇다면 어떻게 될 수 있습니까?핸들러 호출 속도 : Objective-C 대 가상 함수

AFAIK, 가상 함수는 그렇게 느리게 호출하지 않습니다. 적어도 가상 함수가 호출 될 때 어떤 일이 발생하는지 이해하고 있습니다.

  1. vtbl에 대한 포인터를 얻습니다.
  2. 포인터를 참조 해제하고 함수 포인터 배열의 시작 부분을 가져옵니다.
  3. 메서드의 인덱스를 사용하여 배열의 시작 부분을 오프셋 (포인터 단위). 컴파일 타임에 인덱스가 알려졌다는 것을 고려하면, uintptr_t의 배수를 추가하는 것만 큼 쉽습니다.
  4. call 명령어를 발행하십시오.

아쉽게도 Objective-C를 모르므로 성능을 비교하기가 어렵습니다. 그러나 최소한, 가상 함수 호출의 메커니즘은 그렇게 느리지 않습니까? 정적 함수 호출 이외의 다른 방법은 더 빠를 수 있습니까?

+0

첫 번째 측정, 두 번째 최적화. 객관적인 메시지 전달의 오버 헤드가 실제로 CPU 사용의 상당 부분을 차지하는 상황에 있다면 놀랄 것입니다. 그것은 일어날 수 있지만 그렇게 자주는 아닙니다. – bbum

+0

이 성능 테스트 프로젝트를 사용하여 모든 답변을 얻으십시오. https://github.com/LearnCocos2D/LearnCocos2D/tree/master/Cocos2D-Performance-Test – LearnCocos2D

답변

5

이것은 물론 구현에 따라 다릅니다. 의 Obj-C 메소드 호출 가상 함수 호출에 비해 "더 빨리"가 될 수 있을지 모르겠지만, 확실히 SO 여기에 ballpark--의 메커니즘이의 논의가 될 수 있습니다

Objective C message dispatch mechanism

http://www.mikeash.com/pyblog/friday-qa-2009-03-20-objective-c-messaging.html

결론이 선택기는 캐시 될 수있다, 당신이 전화하고있는 셀렉터가 런타임에 캐시되는 경우, 파견 가상의 작업의 순서에 :

마이크 애쉬는 더 여기있다 함수 호출. 또한

:

  1. 표준 면책 조항 :이의 성능은 거의 모든 코드를 본질적으로 무관하다. 믿기 ​​어려운 소수의 경우에만 중요합니다. 귀하의 질문에서 말할 수 없지만, 기본적으로 순수한 Obj-C 또는 C++에서 많은 코드를 구현할지 여부를 결정할 때 결정 기준이되어서는 안됩니다.
  2. Xcode에서 asm을 통해 명시 적으로 동작을 볼 수 있습니다 (그리고 ops를 계산할 수 있습니다 :).