0

コード サンプル 1: 以下のコード セグメントは、大きなサイズのビットマップを処理します。

 //  Here reusing same variable "bitmap"  

    // Decode the JPEG file into a Bitmap 
    Bitmap bitmap = BitmapFactory.decodeFile(photoDir.getAbsolutePath(), bmOptions);

    //Re-sizing 
    Matrix mtx = new Matrix();
    bitmap =Bitmap.createScaledBitmap(bitmap, targetW, targetH,true);
    mtx.postRotate(90);

    // Rotating Bitmap
    bitmap = Bitmap.createBitmap(bitmap, 0, 0, targetW, targetH, mtx, true);
    imgPhoto.setImageBitmap(bitmap );

コード例 2:

     //Here i used different variables

    // Decode the JPEG file into a Bitmap 
    Bitmap orginalBitmap = BitmapFactory.decodeFile(photoDir.getAbsolutePath(), bmOptions);

    //Re-sizing 
    Matrix mtx = new Matrix();
    Bitmap resizedBitmap =Bitmap.createScaledBitmap(orginalBitmap , targetW, targetH,true);
    mtx.postRotate(90);

    // Rotating Bitmap
    Bitmap rotatedBitmap= Bitmap.createBitmap(resizedBitmap , 0, 0, targetW, targetH, mtx, true);

    imgPhoto.setImageBitmap(rotatedBitmap);

質問 : メモリや速度などの点で、どのコード セグメントが優れていますか?

4

2 に答える 2

1

原則として、違いはありません。優れた JVM は、唯一の参照が実際には使用されなくなったローカル参照である場合、オブジェクトをガベージ コレクション可能にし、2 つのコード サンプルがすべての意図と目的に対して同一になるようにします。

存在しない理論上の問題を発明しようとしているのだろうか?実際にパフォーマンスの問題が発生している場合は、プロファイリングしてください。そうでない場合は、あまり心配しないでください。

于 2012-10-08T08:25:49.610 に答える
1

これらはすべて同じであるべきだと思いますよね?つまり、変数はスタック上に存在します。ここで注目に値するのはヒープへの影響です。この場合の 3 つの変数のサイズはごくわずかです。たとえば、最も純粋な形式の 32 ビット ポインター + メタデータ用の別の 32 ビットと同様です。3long秒と 1 秒longでは、ほとんどの最新のマシンでは違いがわかりません (最もスペックの低い Android フォンでも、顕著な影響は見られないはずです)。

メモリをより効率的に使用したい場合、これらすべてからの最大の利益は、2番目に3つの個別の変数を使用すると、古いビットマップをリサイクルして、設定されているものだけを保持できる場合があると思います。画像表示。これにより、メモリをより効率的に使用できます。byte[]ビットマップはアスペクトのために高価です。これらはランダムな割り当てではなく、メモリの連続したブロックでありbyte[]、異なるサイズの を割り当てると非常に少なくなります。そのため、リサイクルはそこで大いに役立ちます。

于 2012-10-08T07:44:32.010 に答える