关于记忆足迹的思考

时间:2015-03-16 11:25:46

标签: android performance android-sqlite memory-footprint

在开发Android应用程序时,我遇到了一个非常相关的问题(至少我认为是这样)。

示例

我们在db(一次)上插入10000行。

db.beginTransaction();
try{
    for(Object toInsert: listOfObjects) {
         ContentValues values = new ContentValues();
        //put the values on the object
        values.put(key, toInsert.getValue());
        db.insert(columnName, null, values);
    }
    db.setTransactionSuccessful();
} catch(Exception e) {
    //handle exception
} finally {
    db.endTransaction();
}

我们在循环中创建了10000个新的ContentValue对象。而VM的对象创建非常昂贵。 如果我们稍微修改一下呢?

不同方法

ContentValues values, hack = new ContentValues();
db.beginTransaction();
try{
    for(Object toInsert: listOfObjects) {
         values = hack;
        //put the values on the object
        values.put(key, toInsert.getValue());
        db.insert(columnName, null, values);
    }
    db.setTransactionSuccessful();
} catch(Exception e) {
    //handle exception
} finally {
    db.endTransaction();
}

在第二个例子中,我们对值对象进行'重置',因为它将在每一行中使用。

所以,我的问题是:我这样做了吗?使用第二种方法,我是在优化流程而不留下大量内存?如果没有,为什么?你对此有什么建议/想法吗?

1 个答案:

答案 0 :(得分:1)

你对这两个变量做错了。

考虑以下情况: 在第一次迭代中,values = new instancehack = new instance。好。 在你values = hack之后。 valueshack现在都指向相同的内存位置。因此创建两个变量毫无意义。

您可以简单地执行以下操作:

ContentValues values = new ContentValues();
db.beginTransaction();
try{
    for(Object toInsert: listOfObjects) {
        //put the values on the object
        values.put(key, toInsert.getValue());
        db.insert(columnName, null, values);
    }
    db.setTransactionSuccessful();
} catch(Exception e) {
    //handle exception
} finally {
    db.endTransaction();
}