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

我想这些都应该是一样的,对吧?我的意思是变量存在于堆栈中,这里的堆影响会很明显。在这种情况下,3 个变量的大小可以忽略不计,就像我们以最纯粹的形式说 32 位指针 + 另一个 32 位元数据一样。3 longs vs 1 long,你无法分辨出大多数现代机器的区别(即使是最低规格的安卓手机也不应该看到明显的影响)。

如果您想要更有效地使用内存,我认为从所有这些中获得的最大收益是,如果在第二个使用 3 个单独的变量时,您可以回收旧的位图并只保留在图像视图。这将更有效地使用内存。由于byte[]方面的原因,位图很昂贵。这些不是随机分配,它们是连续的内存块,当您分配更多byte[]不同大小的内存时,它们会变得非常稀少。所以回收将在那里有很大帮助。

于 2012-10-08T07:44:32.010 回答
1

原则上,它不应该有任何区别。如果唯一的引用是不再实际使用的本地引用,那么一个好的 JVM 将使对象可被垃圾回收,这样您的两个代码示例的所有意图和目的都是相同的。

我想知道你是不是想发明一个不存在的理论问题?如果您实际上在实践中遇到了性能问题,那么请分析一下。如果没有,不要太担心。

于 2012-10-08T08:25:49.610 回答