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?
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?
Antworten:
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 id
Superklasse ü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.
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.
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.
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.