JavaやPythonと比較して、CやC ++のさまざまな速度上のメリットについて多くの議論があるようですが、Objective-Cについてはほとんど言及していません。言語パフォーマンスの面では、大体どこに分類されますか?
JavaやPythonと比較して、CやC ++のさまざまな速度上のメリットについて多くの議論があるようですが、Objective-Cについてはほとんど言及していません。言語パフォーマンスの面では、大体どこに分類されますか?
回答:
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 ++言語のすぐそばです。良好なパフォーマンスが得られない場合は、アルゴリズムを確認してください。どんな深刻な言語でもそうです。
Objective-CはC / C ++よりも低速です。その理由は、この実行モデルを引き継いだSmalltalkと同じ方法で、実行時にメソッドルックアップを動的にディスパッチするObjective-Cのランタイムです。コンパイル時に関数アドレスが決定されるC / C ++での関数呼び出しとは対照的に、実行時のすべてのメソッドのディスパッチは「真のメッセージ送信」と呼ばれます(C ++仮想メソッドを除く)。しかし、Objective-Cがどれほど遅いかは言えません。ASAIKは、パフォーマンスの低下のため、アプリケーション開発にのみ使用されます。
短い答え:C / C ++ / D / Go / Rustと同様の形式にコンパイルされます。Java / .Netのような仮想環境を使用しません。また、Python / Ruby / Lua / JavaScriptのように解釈されません。それで、それはスペクトルのより速い終わりにあります。
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キャッシュミスのために困難な場合があります。