7

次の方法を検討してください。

private static long maskAndNegate(long l) {
    int numberOfLeadingZeros = Long.numberOfLeadingZeros(l)
    long mask = CustomBitSet.masks[numberOfLeadingZeros];
    long result = (~l) & mask;
    return result;
}

メソッドは次のように省略できます。

private static long maskAndNegate(long l) {
    return (~l) & CustomBitSet.masks[Long.numberOfLeadingZeros(l)];
}

これら 2 つの表現は、実際の実行時間において等しいでしょうか? 言い換えれば、Java コンパイラーは、読みやすさとデバッグのために配置した余分な変数の不要な定義を最適化して除去するでしょうか?

4

2 に答える 2

11

Java コンパイラ自体はほとんど最適化を行いません。ほとんどすべてを行うのは JIT です。

ただし、ローカル変数自体は最適化とは多少無関係です。マルチ演算子式では、名前のない「スロット」だけで、スタックに移動するために論理的にさまざまなオペランドが必要です。2 番目のケースでは名前がないだけで、2 つの実装に対して生成されたバイトコードが非常に似ていることがわかるかもしれません。

さらに重要なことは、使用するローカル変数の数を減らすことによって非常にまれに発生する可能性のあるパフォーマンス上の利点は、ほぼ確実に取るに足らないものになるということです。最初の方法の読みやすさの利点は、はるかに大きい可能性があります。いつものように、最適化しようとしている場所がボトルネックであるという証拠を最初に得ずにマイクロ最適化を回避し、その価値が証明された最適化のみを許可します。

(特定のメソッドを最適化する必要があることを証明した時点で、潜在的な最適化をテストするためのツールが既に用意されているため、推測する必要はありません。)

于 2012-11-29T08:13:19.330 に答える
0

コードは、初心者向けに最適化するのに十分な大きさではありません。そして 2 番目の方法ではnumberOfLeadingZeros、すべてへの参照を格納するために使用されるメモリを節約するだけです。

しかし、少なくとも 10000 回など、実行時にこのコードを十分に使用する場合、JIT はそれを HOT コードとして識別し、メソッドのインライン化や同様の並べ替えなどの巧妙なトリックで最適化します。

しかし、あなたの場合、より読みやすいので、好ましいオプションは最初のものです。

小さな最適化のために可読性を犠牲にするべきではありません。

于 2012-11-29T08:45:17.097 に答える