9

重複の可能性:
インターフェイスメソッドの呼び出しが具体的な呼び出しよりも遅いのはなぜですか?

私は最近、インタビュアーが抽象クラスインターフェースのどちらが速いかを尋ねたインタビューに出演する機会がありました。質問と混同しましたが、主に遅延バインディングの概念が抽象クラスのパフォーマンスの遅延を引き起こす可能性があると考えたため、インターフェイスに応答しました。この同じ質問をWebで調べた後、一部のブログによると、インターフェイスメソッドの方が高速ですが、抽象メソッドの方が高速であることがわかりました。私は少し混乱していたので、どちらが速いのか、そしてなぜ強い理由があるのか​​を正しく理解するために、この質問をすることを考えました。

以下によると、抽象クラスは高速ですが、正当な理由はありません。 http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface

4

2 に答える 2

12

答えは、プログラミング言語と、場合によっては使用するコンパイラによって異なります。ランタイム最適化が使用されるJavaVMのような環境では、おそらくまったく答えることができません。そして正直なところ、典型的なJavaプロジェクトでは、違いがあったとしても、ソフトウェアの速度が著しく低下しないほど小さいので、誰も気にしません。厳密なリアルタイム制約がない限り、その場合はJavaを使用しません(おそらくポリモーフィズムはまったく使用しません)。

基本的に、インターフェイスメソッドと抽象メソッドはどちらも動的ディスパッチを使用するため、存在する場合でも違いは最小限に抑えられます。詳細についての知識があまりない場合、理論的には、言語がクラスの多重継承を実装していない限り、抽象メソッドはより高速にディスパッチされると思います。ディスパッチベクトル内のメソッドポインタの位置は静的ですが、インターフェイスメソッド用ではありません(クラスは通常、複数のインターフェイスを実装できます)。

しかし、私が言ったように、私はコンパイラで何が起こるかについての詳細を知りません。私が考えていなかった他の要因があるかもしれません。インタビューでこの質問に答えなければならなかったとしたら、ドン・クヌースの「時期尚早の最適化はすべての悪の根源である」と引用したいと思います。

于 2012-09-20T14:24:25.267 に答える
0

その質問に対する最良の答えは、「本当に本当に必要かどうかを調べるために、小さなテストを書きます」です。実際の例を取得し、制御された条件下で、インターフェイスと抽象クラスのみが異なる 2 つの実装を使用して実行します。具体的な実装がなければ、「どちらが速いか」という質問はほとんど意味がありません。面接担当者が自分を誇示しようとしていた (そしておそらく実際の回答を知らない) か、批判的思考力をテストしようとしていたか (この質問は理にかなっていますか?)、または非常につまらないものでした。

最適化の最初のルールは、do not optimize... yetです。2 番目のルールは、リファクタリングの前にボトルネックを見つけるためにプログラムをプロファイリングすることです。アルゴリズムまたはデータ構造の適切な場所の変更は、多くの場合、必要な唯一のものです。そして、たとえば Java では、hotspot コンパイラーが、abstract と interface の間に何らかの違いをもたらすと確信しています。

于 2012-09-21T00:00:41.827 に答える