Wo fällt Objective-C in das Sprachleistungskontinuum?

20

Es scheint eine große Diskussion über die verschiedenen Geschwindigkeitsmerkmale von C oder C ++ im Vergleich zu Java oder Python zu geben, aber ich sehe selten, dass Objective-C erwähnt wird. Inwieweit fällt es in Bezug auf die Sprachleistung aus?

Fomite
quelle
23
1986 - Brad Cox und Tom Love kreieren Objective-C und verkünden: "Diese Sprache bietet die gesamte Speichersicherheit von C, kombiniert mit der rasanten Geschwindigkeit von Smalltalk." Moderne Historiker vermuten, dass die beiden Legastheniker waren. ( Quelle )
Mason Wheeler
4
Es fällt in den Bereich, in dem Leistung nicht viel ausmacht. Es ist die einzige Sprache, die für die Anbindung an Cocoa unterstützt wird. Wenn Sie das also tun möchten, funktioniert überhaupt nichts. Für alles andere würde ich es für eine schreckliche Wahl halten, unabhängig von der Leistung.
Jerry Coffin
1
"Leistung" ist kein Merkmal einer Sprache, sondern einer Sprachimplementierung und, was noch wichtiger ist, der in dieser Sprache geschriebenen Programme. Sie können in Objective-C sehr schnelle oder sehr langsame Programme schreiben.
Caleb
Es hat keine abscheuliche Syntax, aber es ist keine Sprache mit schlechter Leistung, die auf den aktuellen Compilern basiert, da die Leistung mehr auf dem Compiler / vm als auf der tatsächlichen Sprache basiert.
Rig

Antworten:

28

Im Gegensatz zu C ++ ist Objective-C als saubere Obermenge von C konzipiert. Die wenigen Objective-C-Compiler, die ich verwendet habe, sind besser als C-Compiler bekannt, verarbeiten jedoch auch Objective-C.

Man kann also davon ausgehen, dass in der Codegenerierungsstufe C und Objective-C gleichwertig sind.

Der erste Unterschied tritt in der OOP-ABI auf, die auch als "späte Methodenbindung" bezeichnet wird. Genau wie in C ++ stützt sich Objective-C auf vom Compiler generierte Funktionszeigertabellen, die zur Laufzeit durchlaufen werden.

Im Gegensatz zu C ++ ist die Bindungsmethode jedoch dynamischer und fördert die Verwendung der idSuperklasse überall, wodurch sie theoretisch etwas langsamer als C ++ ist. In der Praxis ist dieser Unterschied weit unter messbar.

Das wichtigste Leistungsproblem ist schließlich die Qualität der verwendeten Bibliotheken. Da Objective-C nur auf Apple-Systemen sehr beliebt ist, kann davon ausgegangen werden, dass Sie es mit Cocoa verwenden. Das ist eine feine Reihe von High-Level-Bibliotheken. In den meisten Fällen können Sie das Heben von Code überlassen, sodass Ihr Code entweder nicht so schnell sein muss oder bei starkem Knirschen wahrscheinlich eine weitgehend statische Codebasis ist, die in etwa der von C ähnelt .

TL; DR: Genau dort, wo es auf C- und C ++ - Sprachen ankommt. Wenn Sie keine gute Leistung erzielen, überprüfen Sie Ihre Algorithmen. so wie in jeder ernsthaften Sprache.

Javier
quelle
4
Tatsächlich ist modernes Objective-C ungefähr so ​​überdurchschnittlich gut wie modernes C ++. In C darf man mit beliebigen Zeigern rechnen, in ObjC nicht. Auch der Leistungsunterschied aufgrund der Methodensuche ist messbar: Der schnelle Pfad von objc_msgSend ist ungefähr viermal schwerer als ein Member-Funktionsaufruf (und die langsamen Pfade sind nicht so schnell wie der schnelle Pfad).
11

Objective-C ist langsamer als C / C ++. Der Grund dafür ist die Laufzeit von Objective-C, die zur Laufzeit dynamisch Methoden-Lookups auslöst, genau wie Smalltalk, von dem es dieses Ausführungsmodell übernommen hat. Der Versand aller Methoden zur Laufzeit wird als "True Message Sends" bezeichnet, im Gegensatz zum Funktionsaufruf in C / C ++, bei dem die Funktionsadresse zur Kompilierungszeit bestimmt wird (mit Ausnahme der virtuellen C ++ - Methoden). Aber ich kann nicht sagen, wie viel langsamer Objective-C ist. ASAIK wird aufgrund der Leistungsbeeinträchtigung nur für die Anwendungsentwicklung verwendet.

OlliP
quelle
1
Fand diesen Leistungsvergleich mit C: rmarcus.info/?p=488. Sieht so aus, als ob Objective-C trotzdem ziemlich nahe an C ist.
OlliP
Es wäre schön, Objective C mit dem Rest des Pakets in Benchmarks 'Game
Deer Hunter,
Ich denke, dass ein Leistungsvergleich mit etwas Salz genommen werden muss, da der Objective-C-Code in gewisser Weise C-Code ist und keine Objecttive-C-Nachricht sendet. Ich weiß nicht, wofür das Downrating ist. Ich habe über ein Jahrzehnt lang Smalltalk entwickelt und Objective-C basiert in vielerlei Hinsicht auf Smalltalk. Ich denke ich weiß wovon ich sprach.
OlliP
Nicht der Downvoter; vor allem in interessiert ist stark numerische Algorithmen, tut dynamische Dispatch keine Rolle , viel in denen.
Deer Hunter
8

Kurze Antwort: Es wurde in einem ähnlichen Format wie C / C ++ / D / Go / Rust kompiliert. Es wird keine virtuelle Umgebung wie Java / .Net verwendet. Und es wird nicht wie Python / Ruby / Lua / JavaScript interpretiert. Es liegt also am schnelleren Ende des Spektrums.

Jacks_Gulch
quelle
7

Die grundlegenden Geschwindigkeitsunterschiede zwischen Obj-C und C / C ++ sind, wie Oliver weiter unten sagt, auf den Versand dynamischer Methoden zurückzuführen.

Dieser Artikel beschreibt diesen Overhead in Obj-C http://it.toolbox.com/blogs/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946

Es ist auch ein sehr nützlicher Trick zur Optimierung Ihres Obj-C-Codes, wenn Sie festlegen, dass der Methodenversand (dh objc_msgSend) der einschränkende Faktor ist. Erhalten Sie einmal einen Zeiger auf die Funktion und verwenden Sie ihn, um die Funktion mehrmals aufzurufen. Es sollte nicht allzu viel helfen, da Obj-C-Laufzeiten diese Optimierung automatisch durchführen .

Beachten Sie, dass die tatsächlichen Kosten für den Versand dynamischer Methoden auf Cachefehler zurückzuführen sind, da die Vorhersage des CPU-Zweigs dadurch unterbrochen wird. Diese sind schwer zu profilieren und es kann sein, dass der oben genannte Code keine echten Cache-Fehlerkosten misst.

Weitere nützliche Informationen finden Sie hier: http://www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605

Fazit: Die größten Unterschiede zwischen den Sprachen sind Ihre Algorithmen. Darüber hinaus besteht aufgrund des Versands dynamischer oder virtueller Methoden ein grundlegender Geschwindigkeitsunterschied zwischen Obj-C, C und C ++. Dieser zweite Punkt scheint nicht groß zu sein. Der obige Artikel bietet einen Trick zur Optimierung, wenn Sie Hotspots über die Profilerstellung finden, was aufgrund von CPU-Cache-Fehlern schwierig sein kann.

MHH
quelle