objective-c의 메소드 오버 헤드로 인해 '다수의 작은 메소드'설계 방식이 바람직하지 않습니까?


15

나는 일반적으로 Clean Code의 Bob Martin이 권장하는 작은 방법을 선호 합니다. 또한 메시지 디스패치 작동 방식에 대한 최소한의 아이디어를 가질 수 있도록 Objective-C 내부에 대해 충분히 읽었습니다 ( 범프 시리즈 는 특히 유익합니다).

조기 최적화 문제에도 불구하고 Objective-c가 objc_msgSend로 수행하는 모든 작업이 실질적으로 Objective-C 프로젝트에 '다수의 작은 방법'접근법을 사용할 수 없을 정도로 중요한지 알고 싶습니다.

실증적 발견은 특히 환영합니다 (언제나 테스트를 직접 설정하겠습니다). 큰 objective-c 프로젝트를 작성한 사람의 경험도 훌륭합니다.

설명

질문의 일반적인 어조는 의도적입니다. 특정 앱의 성능 조정에 대해 묻지 않고 (SO 대신에 여기에 묻는 이유) Objective-C의 언어 특성이 특정 디자인 방식을 방해하는지 여부에 대해 자세히 설명합니다. Apple에서 본 많은 코드와 github 등의 다른 당사자가 큰 메소드 (및 클래스)로 향하는 경향이 있으며, 이것이 언어로 인해 편견이 있는지 궁금합니다. 그 자체. 물론 잘못된 코드를 읽었거나 기술적 인 요소보다는 문화적 요소 일 수 있습니다.

(가치가있는 것은 현재 Objective-C를 작성하고 있으며 작은 방법을 사용하고 있습니다)

추가 요청

주어진 답변에 모두 동의합니다. 내가 원하는 또 다른 것은 누군가가 멋진 짧은 메소드 (및 작은 클래스)를 사용하는 (전망 적으로 실질적인) 오픈 소스 (또는 눈에 보이는) Objective-C 코드베이스를 가리 키도록하는 것입니다. Objective-C에서 아직 fitnesse source 와 비교할만한 것을 보지 못했습니다 .


1
Mike Ash에는 LeopardiOS의 숫자를 보여주는 멋진 게시물 쌍이 있습니다. 나는 이것을 완전히 소화하지는 않았지만 캐시 된 IMP의 경우 오버 헤드는 무시할 수 있고 검색이 필요한 디스패치에서도 꽤 작습니다. 이 빠른 인상이 옳다면 작은 방법이 다른 언어와 마찬가지로 ObjC의 동일한 설계 환경에 서 있거나 떨어지는 것처럼 보일 수 있습니다.
Cris

1
이러한 오버 헤드를 피하려면 C 함수를 사용하십시오.
rightfold

기술적으로는 가능하지만 기능이 많이 손실되었습니다. 나는 코드의 목표에 맞춰 성능에 민감한 부분만을위한 함수로 메소드를 대체 할 것이다. 여기서 선호하는 코딩 / 디자인 스타일을 재고하기에 오버 헤드가 문제가 될 수 있는지 여부를 묻습니다.
Cris

좋은 답변 은 Objective-C의 메시지 발송 비용을 참조하십시오 .
Caleb

Xcode에서 단순히 코드를 프로파일 링하지 않는 이유는 무엇입니까? 추상적 인 코드가 아니라 추상적 인 것을 요구한다는 것을 이해하지만 많은 작은 메소드가있는 코드가 분명히 있기 때문에 코드를 실행하고 직접 보지 않겠습니까?
Caleb

답변:


4

나는 오버 헤드가 무시할 수 있는지 여부를 정말로 모른다. 그러나 먼저 이해하기 쉽고 유지 관리 가 쉬운 시스템을 설계하는 것이 좋습니다. 이는 일반적으로 소규모의 집중된 방법과 클래스를 의미합니다. 이는 후속 코드 튜닝에도 도움이됩니다 (코드를 유지 관리하기 쉽기 때문에). 또한 실제 병목 현상을 찾기 위해 코드를 프로파일 링하는 것이 중요하며, 이는 메서드 호출 오버 헤드와 관련이 없을 수도 있습니다. 프로세스 외부 작업 (예 : 데이터베이스, 네트워크, 파일 시스템 호출)을 수행하면 프로그램 실행 시간이 지배적입니다.

그러나 평소와 같이 마일리지는 다를 수 있습니다 ...


물론 나는이 모든 것에 동의합니다 (질문의 'Uncle Bob'참조). 그러나 특정 베스트 케이스 디자인 방식 에 일반적으로 언어가 적합하지 않은 경우 프로그래머가 다른 선택을 할 수 있습니다. 나는 작은 메소드 (및 클래스, 해당 문제 접근 방식)를 실제로 따르는 Objective-C 코드를 많이 보지 못했고 왜 그런지 궁금합니다. 질문에 메모를 추가하겠습니다.
Cris

@Cris : "실제로 작은 방법을 따르는 Objective-C 코드를 많이 보지 못했습니다."-> 궁금한 점은 무엇입니까? 나는 그것을 믿지만 그것은 또한 마이크로 최적화 인식 때문이 아니라 더 많은 프로그래머들이 좋은 디자인과 유지 보수의 신조에 초점을 맞추지 않는다고 믿는다. Java, C #, Ruby 또는 다른 코드를 동일한 방식으로 따라야합니다.
Jordão

예, 가능합니다. 특정 코드베이스를 염두에 두지 않았습니다. 제가 1 년 이상 살펴본 결과 Objective-C와 함께 작업했습니다. 내가 본 가장 큰 코드 세트는 Omni 그룹의 오픈 소스 자료와 많은 큰 방법을 가진 IIRC였습니다. Apple의 샘플 코드도 종종 있습니다. 그러나 물론 (a) 샘플 코드는 단지 (b) 내 샘플은 UI 코드, 특히 뷰 컨트롤러에 가중치가 부여 될 수 있으며 더 깊은 레이어와 다르게 코딩 될 수 있습니다.
Cris

2

대부분의 코드는 모든 응용 프로그램 에서 성능이 중요 하지 않으므로 다른 언어와 비교하여 메서드 오버 헤드가 중요하더라도 최적의 접근 방식은 대부분의 장소에 많은 작은 메서드가 있고 프로파일 링하는 메서드 만 인라인하는 것이 좋습니다 성능이 중요한 것으로 나타났습니다.

물론 올바르게 최적화하는 방법을 모르는 사람들이 많으며 일부는 메소드 오버 헤드에 대해 알고 글로벌 조기 최적화에 관여 할 수 있지만 그룹이 큰 영향을 줄 정도로 큰 것은 아니라고 생각합니다. Objective-C 생태계에서

대형 방법과 클래스는 알고하거나 프로파일, 방법 오버 헤드에 대한 배려 아무것도 사람들의 큰 그룹의 일이 될 훨씬 더 가능성이 또는 적절한 설계, 누가 생산하는 경향이 진흙의 큰 공을 에서 어떤 언어. 그렇습니다.이 사람들 중 일부는 주요 소프트웨어 회사의 주요 코드베이스에서 작업하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.