5

私は次のコードを持っています

 float square(float val) { return val*val;}
 boolean isInCircle(final float x,final float y) {

        float squareDistance = square(cx - x) + square(cy - y);
        return squareDistance < square(RADIUS);
    }

はどこにRADIUSありますかstatic final float

Javaコンパイラは呼び出しを最適化しますsquare(RADIUS)か?

dalvikこれをコードに変換するとどうなりandroidますか?最適化されたままになりますか?

4

4 に答える 4

3

Javaコンパイラはそのコードでは何もしません。

HotSpot JVMは、ほぼ確実にsquare(RADIUS)を事前計算します。

Androidにはその特定のJVMはありません。

私は個人的にsquare()メソッドをまったく記述return (cx-x)*(cx-x)+(cy-y)*(cy-y) < RADIUS*RADIUS;せず、コンパイラー/JVMにそこから戦わせます。しかし、私は数学者です;-)

于 2012-07-12T06:31:31.277 に答える
2

Dalvik JITコンパイラーは、実際square()には、質問で定義されているようなインラインの短い関数を実行します(ただし、宣言する方がよいでしょうstatic)。しかし、それが確実にインライン化されるかどうかは、手元にあるとは言えませんでした。

重要な場合は、コードのプロファイルを作成してください。

于 2012-07-16T16:02:26.683 に答える
1

Javaでの最適化は、(私が知る限り)実行時にHotSpotコンパイラによって行われます(バイトコードはマシンコードに変換されるときに最適化されます)。したがって、答えは「はい」と「いいえ」です。

変換されたコードも同様に最適化されますが、JVMに依存します。私の経験によると、それはJVMに大きく依存しており、おそらくその設定(オプティマイザーの攻撃性)に依存しています。Windows JVMとLinuxで、SHA1の実行をループありとなしで比較しようとしました。あるケースでは、ループのないコードは何倍も高速でしたが、2番目のケース(Linuxでは私は思います)では、かかった時間の約40%の違いしかありませんでした...

したがって、これは魔法です。HotSpotにJVMを最適化または構成するための適切なヒントを与えることができますが、それでも、JVMの現在のアルゴリズムに依存します...

于 2012-07-12T06:31:29.077 に答える
-1

発生する唯一の最適化は、コンパイラが実行時にフィールドルックアップを実行するのではなく、静的最終フィールドの値をアクセス先の定数として「インターン」する可能性が高いことです。

于 2012-07-12T17:35:28.647 に答える