Objective-Cは、言語パフォーマンスの連続体のどこに該当しますか?


20

JavaやPythonと比較して、CやC ++のさまざまな速度上のメリットについて多くの議論があるようですが、Objective-Cについてはほとんど言及していません。言語パフォーマンスの面では、大体どこに分類されますか?


23
1986-Brad CoxとTom LoveはObjective-Cを作成し、「この言語には、Cのすべてのメモリの安全性と、Smalltalkの非常に速い速度が組み合わされています」と発表しました。現代の歴史家は、この2人が失読症であると疑っています。(ソース
メイソンウィーラー

4
パフォーマンスがそれほど重要でない範囲に分類されます。Cocoaとのインターフェース用にサポートされている唯一の言語です。したがって、それを実行したい場合、他には何も機能しません。それ以外の場合は、パフォーマンスに関係なく、ひどい選択だと思います。
ジェリーコフィン

1
「パフォーマンス」は言語の特性ではなく、言語実装の特性であり、さらに重要なことには、その言語で書かれたプログラムの特性です。Objective-Cで非常に高速なプログラムを書くことも、非常に遅いプログラムを書くこともできます。
カレブ

恐ろしい構文を持つことに失敗しますが、パフォーマンスは実際の言語よりコンパイラ/ vmに基づいているため、現在のコンパイラに基づいたパフォーマンスの悪い言語ではありません。
リグ

回答:


28

C ++とは異なり、Objective-CはCのクリーンなスーパーセットとして設計されています。私が使用したいくつかのObjective-Cコンパイラは、Cコンパイラとしてよく知られていますが、Objective-Cも処理します。

そのため、コード生成レベルでは、CとObjective-Cは同等であると想定しても安全です。

最初の違いは、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 ++よりも低速です。その理由は、この実行モデルを引き継いだSmalltalkと同じ方法で、実行時にメソッドルックアップを動的にディスパッチするObjective-Cのランタイムです。コンパイル時に関数アドレスが決定されるC / C ++での関数呼び出しとは対照的に、実行時のすべてのメソッドのディスパッチは「真のメッセージ送信」と呼ばれます(C ++仮想メソッドを除く)。しかし、Objective-Cがどれほど遅いかは言えません。ASAIKは、パフォーマンスの低下のため、アプリケーション開発にのみ使用されます。


1
Cとのパフォーマンスの比較を見つけました:rmarcus.info/?p = 488 Objective-CはCに非常に近いように見えます。
OlliP


Objective-CコードはObjective-Cメッセージ送信ではなくCコードをある程度拡張するものであるため、一部のソルトでパフォーマンス比較を行う必要があると思います。ダウンレーティングの目的がわかりません。Smalltalkの開発は10年以上行いましたが、Objective-Cは多くの点でSmalltalkに基づいています。私が話していたことを知っていると思います。
OlliP

ダウンボーターではありません。主にダイナミックディスパッチは問題ではない、重く数値アルゴリズムに興味がずっと 内のものを。
鹿ハンター

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 ++の間には基本的な速度の違いがあります。この2番目のポイントは大きくないようです。また、プロファイリングでホットスポットを見つけることができる場合、上記の記事は最適化の秘givesを提供します。これは、CPUキャッシュミスのために困難な場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.