web-dev-qa-db-ja.com

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

JavaまたはPython)と比較して、CまたはC++のさまざまな速度メリットについては多くの議論があるようですが、Objective-Cについて言及することはめったにありません。言語パフォーマンスの?

20
Fomite

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++言語の場合、最も重要なのはそこにあります。良いパフォーマンスが得られない場合は、アルゴリズムを確認してください。真剣な言葉のように。

28
Javier

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

11
OlliP

短い答え:C/C++/D/Go/Rustと同様の形式にコンパイルされます。 Java/.Netのような仮想環境は使用しません。また、Python/Ruby/Lua/JavaScriptのように解釈されません。ですから、それはスペクトルのより速い端にあります。

8
Jacks_Gulch

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

7
MHH