Objective-C는 언어 성능 연속체에서 어디에 속합니까?


20

Java 또는 Python과 비교할 때 C 또는 C ++의 다양한 속도 장점에 대해 많은 논의가있는 것처럼 보이지만 Objective-C는 거의 언급하지 않습니다. 언어 성능 측면에서 대략 어디에 있습니까?


23
1986-Brad Cox와 Tom Love는 Objective-C를 작성하여 "이 언어에는 C의 모든 메모리 안전성과 스몰 토크의 모든 놀라운 속도가 결합되어 있습니다"라고 발표했습니다. 현대 역사가들은 두 사람이 난독증에 걸린 것으로 생각합니다. ( 출처 )
Mason Wheeler

4
성능이 중요하지 않은 범위에 속합니다. Cocoa와의 인터페이스를 위해 유일하게 지원되는 언어이므로 원하는 경우 다른 기능이 전혀 없습니다. 다른 어떤 것도 성능에 관계없이 끔찍한 선택이라고 생각합니다.
Jerry Coffin

1
"성능"은 언어의 특성이 아니라 언어 구현 및 그보다 중요한 언어로 작성된 프로그램의 특성입니다. Objective-C에서 매우 빠른 프로그램을 작성하거나 매우 느린 프로그램을 작성할 수 있습니다.
Caleb

끔찍한 구문에는 실패하지만 성능은 실제 언어보다 컴파일러 / vm에 기반하기 때문에 현재 컴파일러를 기반으로 한 성능이 나쁜 언어는 아닙니다.
Rig

답변:


28

C ++과 달리 Objective-C는 C의 깔끔한 수퍼 세트로 설계되었습니다. 내가 사용한 소수의 Objective-C 컴파일러는 C 컴파일러로 잘 알려져 있지만 Objective-C도 처리합니다.

따라서 코드 생성 수준에서 C와 Objective-C는 동일하다고 가정하는 것이 안전합니다.

첫 번째 차이점은 "late method binding"이라고도하는 OOP ABI에 나타납니다. C ++에서와 마찬가지로 Objective-C는 런타임에 순회하는 컴파일러 생성 함수 포인터 테이블을 사용합니다.

그러나 C ++과 달리 바인딩 방법은보다 '동적'이며 id수퍼 클래스 사용을 촉진하여 이론적으로 C ++보다 약간 느립니다. 실제로이 차이는 측정 할 수없는 수준입니다.

마지막으로 가장 중요한 성능 문제는 사용 된 라이브러리의 품질입니다. Objective-C는 Apple 시스템에서만 널리 사용되므로 Cocoa와 함께 사용한다고 가정하는 것이 합리적입니다. 이것은 고급 라이브러리의 훌륭한 세트입니다. 대부분의 경우 무거운 리프팅을 남겨 둘 수 있으므로 코드가 너무 빠를 필요가 없거나 무거운 크 런칭을 수행하는 경우 일반 C와 거의 비슷한 정적 코드 코드 일 가능성이 높습니다 .

TL; DR : 가장 중요한 곳에 C 및 C ++ 언어가 있습니다. 성능이 좋지 않으면 알고리즘을 확인하십시오. 다른 어떤 언어에서도 마찬가지입니다.


4
사실 현대 objective-c는 현대 C ++만큼이나 초 고성능입니다. C에서는 임의의 포인터에 대해 산술을 할 수 있으며 ObjC에서는 할 수 없습니다. 또한 메소드 조회로 인한 성능 차이를 측정 할 수 있습니다. objc_msgSend의 빠른 경로는 멤버 함수 호출보다 약 4 배 무겁습니다 (느린 경로는 빠른 경로만큼 빠르지 않습니다).

11

Objective-C는 C / C ++보다 느립니다. 그 이유는 스몰 토크와 동일한 방식으로 메소드 검색을 동적으로 디스패치하는 Objective-C의 런타임이기 때문에이 실행 모델을 인수 한 것입니다. 컴파일 타임에 함수 주소가 결정되는 C / C ++에서의 함수 호출과 달리 런타임시 모든 메소드를 "진짜 메시지 전송"이라고합니다 (C ++ 가상 메소드 제외). 그러나 Objective-C가 얼마나 느린 지 말할 수 없습니다. ASAIK는 성능 저하로 인해 응용 프로그램 개발에만 사용됩니다.


1
C와의 성능 비교를 찾았습니다. rmarcus.info/?p=488 Objective-C는 C와 매우 비슷해 보입니다.
OlliP

Objective C를 Benchmarks 'Game
Deer Hunter

Objective-C 코드가 Objecttive-C 메시지 전송이 아닌 C 코드를 확장하는 것이므로 성능 비교를 소금으로 수행해야한다고 생각합니다. 다운 레이팅이 무엇인지 모르겠습니다. 저는 10 년 이상 스몰 토크 개발을 수행했으며 Objective-C는 여러 가지 방법으로 스몰 토크를 기반으로합니다. 내가 무슨 말을했는지 알 것 같아
OlliP

downvoter가 아닙니다. 주로 숫자가 큰 알고리즘에 관심이 있으며 동적 디스패치는 그중 에서 중요하지 않습니다 .
사슴 사냥꾼

8

짧은 대답 : C / C ++ / D / Go / Rust와 비슷한 형식으로 컴파일됩니다. Java / .Net과 같은 가상 환경을 사용하지 않습니다. 그리고 그것은 Python / Ruby / Lua / JavaScript처럼 해석되지 않습니다. 따라서 스펙트럼의 가장 빠른 끝에 있습니다.


7

Oliver가 아래에 언급 한 것처럼 Obj-C와 C / C ++의 기본 속도 차이는 동적 메서드 디스패치 때문입니다.

이 기사는 Obj-C http://it.toolbox.com/blogs/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946 에서이 오버 헤드를 프로파일 링

또한 메소드 디스패치 (예 : objc_msgSend)가 제한 요인이라고 판단 할 때 Obj-C 코드를 최적화하기위한 매우 유용한 트릭을 제공합니다. 함수에 대한 포인터를 한 번 얻은 다음이를 여러 번 호출하는 데 사용하십시오. Obj-C 런타임이이 최적화를 자동으로 수행 하므로 너무 도움이되지 않습니다 .

동적 메소드 디스패치의 실제 비용은 CPU 분기 예측을 위반하므로 캐시 누락으로 인한 것입니다. 이것들은 프로파일하기가 어렵고 위에 인용 된 코드가 실제 캐시 미스 비용을 측정하지 않을 수도 있습니다.

좀 더 유용한 토론이 여기 있습니다 : http://www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605

결론 : 언어 간의 가장 큰 차이점은 알고리즘입니다. 게다가 동적 또는 가상 메소드 디스패치로 인해 Obj-C, C 및 C ++간에 기본 속도 차이가 있습니다. 이 두 번째 요점은 크지 않은 것 같습니다. 그리고 위의 기사는 프로파일 링을 통해 핫스팟을 찾을 수있는 경우 CPU 캐시 누락으로 인해 어려울 수있는 경우 이를 최적화하기위한 트릭을 제공합니다 .

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