哪个代码段表现良好(在分配变量时处理内存)+ java

时间:2012-10-08 07:34:10

标签: java android memory-management

代码示例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);

问题:在内存和速度方面哪个代码段更好?

2 个答案:

答案 0 :(得分:1)

我认为这些都应该是一样的,对吗?我的意思是变量存在于堆栈中,这是堆影响,这将是显而易见的。在这种情况下,3个变量的大小可以忽略不计,比如说最纯粹的32位指针+另一个32位的元数​​据。 3 long s vs 1 long,你无法区分大多数现代机器(即使最低规格的android手机也不应该看到明显的影响)。

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

答案 1 :(得分:1)

原则中,它应该没有任何区别。如果唯一的引用是不再实际使用的本地引用,那么一个好的JVM将使一个对象可以被垃圾回收,这样你的两个代码样本就可以完全相同。

我想知道你是否在试图发明一个不存在的理论问题?如果您实际上遇到了性能问题,那么请进行配置文件。如果没有,请不要太担心。