2010-06-02 5 views
0

사용자가 함께 작업 목록을 작성하려고합니다. 이러한 작업 목록은 수백 또는 수천 개의 항목이 될 수 있습니다.msg_send 호출에 얼마나 많은 오버 헤드가 발생합니까?

바탕 화면에 대한
NSArray *arrayOfTasks = .... init and fill with thousands of tasks 

for (id *eachTask in arrayOfTasks) 
{ 
    if (eachTask && [eachTask respondsToSelector:@selector(execute)]) [eachTask execute]; 
} 

, 이것은 아무 문제 없을 수 있지만, 아이폰 또는 아이 패드 :

내가 아는 바로는

, 가장 쉽고 확실한 방법은 배열을 구축 한 다음 반복하는 것 , 이것은 문제 일 수 있습니다. 이것은 좋은 방법인가요? 아니면 같은 것을 성취하기위한 더 빠른 방법이 있습니까?

msg_send가 얼마나 많은 오버 헤드가 발생하는지 묻는 이유는 똑같은 C 구현을 수행 할 수도 있기 때문입니다. 예를 들어 링크 된 목록을 조합하고 블록을 사용하여 다음 작업을 처리 할 수 ​​있습니다. 그로부터 무엇인가를 얻을 수 있습니까? 아니면 그 가치보다 더 큰 문제입니까?

+1

'eachTask'가 nil이 아닌지 확인할 필요가 없습니다. 'respondToSelector :'는'eachTask'가 nil이거나'execute'에 응답하지 않으면 NO가됩니다. – dreamlax

+2

어쨌든 NSArray에서 'nil'값을 얻지는 않을 것입니다. – kperryua

+2

'id *'가 여기에 잘못되었습니다 – newacct

답변

6

나는 objc_msgSend에 대해 이야기하고 있다고 가정합니다.이 경우, Bill Bumgarner는 우수한 가치를 지니고있는 4 Part Series입니다.

일반적으로 Obj-C를 사용하는 것이 좋습니다. 이것이 iDevices를위한 모든 애플 리케이션이 애플을 포함하여 사용하는 것입니다, 그리고 수백 가지 항목은 장치를 죽이지 않을 것입니다. rynmrtn 말했다 무엇

+0

+1 멋진 기사 – shosti

+0

감사합니다! 훌륭한 기사! – pxl

+0

내 의견에 대한 보충 조항 ... 나는 물건의 내장에 들어가기를 좋아하고, 사과의 문서는 지금까지만 갈뿐입니다. 그래서 이것은 정말 훌륭한 기사입니다! – pxl

0

...

당신의 -execute 방법은 상당히 단순했다 않는

-/증가 스칼라 값의 작은 소수의 테스트 - 다음은 objc_msgSend()도 프로그램의의 %로 표시되지 않을 수도 있습니다 CPU 시간.

먼저 측정하고 최적화하십시오.

코드가 질문을 제기합니다. 왜 수없는 arrayOfTasks에 물건을 넣고 있습니다. 귀하의 arrayOfTasks에있는 모든 것을 당신이 만든 서브 클래스라고 가정하면, 테스트에 응답하지 않고 execute 메소드를 추가 할 수 있습니다. 컬렉션 클래스의 계층 구조가있는 경우 카테고리를 사용하여 메소드를 추가 할 수 있습니다. 즉, 안전하게 접두어를 붙이면됩니다 (즉, pxl_execute 또는 무언가).

+0

아마 의사 코드를 사용해야했지만 아이디어는 수천 개의 객체 목록을 통해 각각의 메소드를 호출합니다. – pxl

0

Hereobjc_msgSend을 비롯한 일반적인 작업의 벤치 마크 비교입니다. 일반적으로 iPhone의 경우에도 objc_msgSend의 성능에 대해 걱정할 필요가 없습니다. 메시지 전송은 항상 직선적 인 C 함수 호출보다 느리지 만 최신 프로세서에서는 (iPhone 프로세서는 여전히 약 500MHz 임), 그 차이는 대부분 사소한 것입니다. 프로파일 링에서 objc_msgSend에 많은 시간이 사용되었다고 표시되면 Objective-C 메소드 대신 C 함수를 사용하는 것이 좋습니다.

명확성을 위해 객체를 반복하는 대신 또는 (Mac의 경우) enumerateObjectsUsingBlock:을 사용할 수 있지만 성능 차이가 크지 않을 것이라고 생각합니다.

+0

감사합니다! 의견과 내가 독자적으로 읽고있는 것, 나는 objc_msgSend에 관해서는 전혀 걱정할 필요가 없으며 단지 작동하는 것을 꺼내야합니다. 그런 다음, 제안한 것처럼 성능 벤치 마크를 실행하고 모든 병목 현상과 저속 지점이 어디인지 파악하십시오. – pxl

관련 문제