こんにちはクラスメソッドは、インスタンスをロードする必要がないため、一般的にインスタンスメソッドよりも高速であると測定されていますか?もしそうなら、可能であればクラスメソッドを使用する必要がありますか?ありがとう
9 に答える
何がどれだけ高速であるかに関係なく、覚えておく必要のある大きな違いが1つあります。
@Override
静的メソッドは使用できません。
これは非常に重要です。なぜなら、Javaの主要な利点の1つ、つまりサブクラス化されたオブジェクトのメソッドのオーバーライドは使用しない、または使用できないということです。静的メソッドを呼び出すときは、その静的メソッドをそのまま使用し、サブクラス化されたオブジェクトでオーバーライドすることはできません。
また、「どちらが速いか」を解決するには、実際の調査結果を調査するためのマイクロベンチマークだけでなく、 REALテストを作成します。JITの実装がこれに影響を与える可能性があるため、いくつかのJVMを使用して測定します。
メソッドがインスタンスを必要としない場合、IMOはクラスメソッドである必要があります。また、クラスメソッドはインスタンスを使用しない場合にのみ可能であるため、質問は
可能な場合はクラスメソッドを使用する必要があります
肯定的な答えがあります。
しかし、効率上の理由からではありません
いいえ、高速ではありません。
ただし、可能な場合は常にクラスメソッドを使用することをお勧めします。これは、メソッド内のロジックがメンバー変数にアクセスする必要がないことを示しているためです。
私が言っているのは、静的なインスタンスメソッドを使用しないでください。
「クラスメソッド」はクラスのすべてのインスタンスで使用でき、「インスタンスメソッド」は現在のインスタンスで使用できます。したがって、すべてのインスタンスに適用したときにクラスメソッドが高速になる理由がわかりません...
クラスメソッドの方が速いかもしれませんが、そのような考え方でコードを書くべきではありません。必要なときにクラスメソッドを使用する必要があります。配列のようなユーティリティクラスは良い例です。シングルトンを返すファクトリ。クラスの内部にアクセスする必要がある場合は、絶対に使用しないでください。
クラスメソッドとインスタンスメソッドを比較するときは、インスタンスメソッドを、という追加のパラメータを持つクラスメソッドと考えてみてくださいthis
(実際、一部の言語ではインスタンスメソッドが実装されています)
したがって、質問は、「パラメータが1つ少ない場合、私のメソッドはより高速になりますか?」になります。パラメータリストはパフォーマンスとはほとんど関係がないため、この質問は実際には意味がありません。
メソッドを静的にするかインスタンスにするかは、メソッドの性質と、パフォーマンス上の早期のメリットではなく、必要なデータに基づいて決定するようにしてください。はい、パフォーマンスは機能ですが、それだけが機能ではありません。
最後の経験則:測定、測定、測定。ある本や記事が何かがもっと速いはずだと言ったからといって、それがあなたのために働くという意味ではありません。実際のケースで試して、経験的なデータでバックアップしてください。
私の経験から、オブジェクトを初期化し、配列などを使用するなど、何らかの方法でオブジェクトを保持する必要がある場合は、その特定のインスタンスでインスタンスメソッドを呼び出すのが最善です。
クラスメソッドを呼び出して、初期化した同じインスタンスをそのクラスメソッドへの引数として渡す意味はありません。実行時の効果についてはよくわかりませんが、これを行うのは(名目上かどうかにかかわらず)無駄のようです。
私は主に、可能な限り初期化する必要のない操作にクラスメソッドを使用します。たとえば、MathFunctionsクラスには、三角関数メソッドへのすべてのゲッターが含まれています。MathFunctionsオブジェクトを初期化して作成し、インスタンスメソッドを呼び出して、これらのメソッドの1つから任意の結果を取得するだけでは意味がありません。クラスメソッドを呼び出すだけの方が簡単(かつ高速)です。
したがって、どちらの場合も、「クラスメソッド>インスタンスメソッド」またはその逆はありません。それは単にあなたのアプリケーションとあなたの必要性に依存します。最小限のデータを保持するクラス(MathFunctionsなど)のオブジェクトを初期化する場合は、何よりも常識を使用してください。おそらく、クラスメソッドを使用したほうがよいでしょう。
ただし、逆に、オブジェクトを初期化してから、それらを引数としてクラスメソッドに渡す場合は、インスタンスメソッドを使用した方がよいでしょう。
それは私の2セントですが、私はまだプログラミングに比較的慣れていないので、それを覚えておいてください。
一般的にはわかりませんが、しばらく前にいくつかのアプリケーションで測定したことを覚えています。静的メソッドの方が確かに高速でした。
設計の観点から、私は、賢明に静的である可能性がある(つまり、インスタンスをパラメーターなどとして明示的に渡さない)メソッドは、そうあるべきであると主張します。