某些语句执行所需的时间不是常数

时间:2013-07-18 02:12:32

标签: android sqlite cursor android-sqlite android-cursor

在我的SQLite Adapter类中,对于Android应用程序,我有以下方法。键KEY_WAS可以是0或1.该方法在数据库中搜索给定的name和给定的date(对于给定的日期,只能有一个唯一的条目DB中的特定名称)。因此,如果存在这样的条目,我们进入if,否则was保持为零。最后,返回was

public int wasHere(String name, String date) throws SQLException {
    Log.d("wasHere", "begins, date = " + date);
    Cursor c = ourDatabase.query(DATABASE_TABLE, ALL_KEYS, KEY_NAME
            + "=" + "'" + name + "'" + " AND " + KEY_DATE + "=" + "'"
            + date + "'", null, null, null, null);
    Log.d("wasHere", "below Cursor");
    int was = 0;
    if(c.moveToFirst()) {
        Log.d("wasHere", "inside IF");
        was = c.getInt(c.getColumnIndex(KEY_WAS));
    }
    Lod.d("wasHere", "ends");
    return was;
}

从日志条目中,我粘贴了一些特定的条目(您可以忽略“开始”和“结束”之间的时间,因为这取决于调用wasHere的循环):

07-18 07:08:03.398: D/dbwas(29568): begins, date = 08 Aug 2013
07-18 07:08:03.398: D/dbwas(29568): below cursor
07-18 07:08:03.398: D/dbwas(29568): ends

07-18 07:08:03.398: D/dbwas(29568): begins, date = 09 Aug 2013
07-18 07:08:03.406: D/dbwas(29568): below cursor
07-18 07:08:03.406: D/dbwas(29568): ends

07-18 07:08:03.359: D/dbwas(29568): begins, date = 02 Aug 2013
07-18 07:08:03.359: D/dbwas(29568): below cursor
07-18 07:08:03.367: D/dbwas(29568): inside IF
07-18 07:08:03.367: D/dbwas(29568): ends

07-18 07:08:03.367: D/dbwas(29568): begins, date = 03 Aug 2013
07-18 07:08:03.367: D/dbwas(29568): below cursor
07-18 07:08:03.375: D/dbwas(29568): inside IF
07-18 07:08:03.375: D/dbwas(29568): ends

07-18 07:08:03.430: D/dbwas(29568): begins, date = 14 Aug 2013
07-18 07:08:03.430: D/dbwas(29568): below cursor
07-18 07:08:03.430: D/dbwas(29568): inside IF
07-18 07:08:03.430: D/dbwas(29568): ends

我的问题是关于“开始”和“结束”的日志时间。如您所见,在五个日志条目中,两个(8月8日和8月14日)从“开始,日期= ...”到“结束”需要0次。

8月9日执行Cursor语句需要8毫秒(.008秒)。

8月8日 3月8日执行if语句需要8毫秒(.008秒)。

8月14日没有时间执行上述两个陈述中的任何一个。

同样,“日志”中存在许多此类差异。对于不同的日期,Cursorif语句随机占用8毫秒(是的,时间总是8毫秒)。

现在,我正在执行“wasHere”方法数百次,因此数百个8毫秒花费了我太多时间。为什么上述差异是随机发生的。是否有任何方法可以删除它(或者可能是另一种方式来做我正在做的事情)。 [8月8日和8月14日的陈述应该是零时间。]

1 个答案:

答案 0 :(得分:1)

在您的系统上,定时器中断显然以125 Hz运行,因此每8 ms发生一次。 如果你的函数在两个定时器中断之间完全执行,你会看到时间戳没有变化,但是如果你的函数执行时发生了定时器中断,你会看到8 ms的跳跃。

实际执行时间没有差异;日志中的时间戳不够精确。