0

我有一种方法可以进行一些过滤操作。此方法循环调用 10000 次。此方法的平均执行时间约为 3000-5000 纳秒(用 测量System.nanoTime())。但有时(10000 个样本中有 5-10 个样本)它的峰值甚至达到 120000 纳秒。它永远不会在同一个样本上发生两次,因此它不是数据错误。这些随机减速的原因可能是什么?我认为它不相关,但代码如下:

private static int lowPassFilter(int data)
{
    long startTime = System.nanoTime();
    int y0 = 0;
    lcount++;
    lx[ln] = lx[ln + 13] = data;
    y0 = (ly1 << 1) - ly2 + lx[ln] - (lx[ln + 6] << 1) + lx[ln + 12];
    ly2 = ly1;
    ly1 = y0;
    y0 >>= 5;
    if(--ln < 0)
        ln = 12;
    long endTime = System.nanoTime();
    long diff=endTime - startTime;
    return(y0);
}
4

2 回答 2

2

它很可能是垃圾收集器。

由于这是一个调用了数千次的紧密循环,因此您实际上可能想要优化内存分配。

Android 文档中有一些提示,但基本要点是:

不要做你不需要做的工作。

如果可以避免,请不要分配内存。

一些在这里可能有用的提示:

对常量使用静态 final

我在您的代码中看到了很多常量。如果您使用 static final 来存储这些常量,则暗示 GC 不需要积极收集它们。所以,像这样:

static final int zero = 0;
static final int offset0 = 13;
static final int offset1 = 1;
static final int offset2 = 6;
static final int offset3 = 12;
static final int offset4 = 5;
private static int lowPassFilter(int data)
{
    long startTime = System.nanoTime();
    int y0 = zero;
    
    lcount++;
    lx[ln] = lx[ln + offset0] = data;
    y0 = (ly1 << offset1) - ly2 + lx[ln] - (lx[ln + offset2] << 1) + lx[ln + offset3];
    ly2 = ly1;
    ly1 = y0;
    y0 >>= offset4;
    if(--ln < 0)
        ln = offset3;
    long endTime = System.nanoTime();
    long diff=endTime - startTime;
    return(y0);
}

本质上,这导致它使用“常量”指令,而不是字段查找。

注意:此优化仅适用于原始类型和字符串常量,不适用于任意引用类型。不过,尽可能将常量声明为 static final 是一种很好的做法。

链接页面上还有很多其他技巧,例如避免使用浮点数,但我将把它作为练习留给读者。这应该会有所帮助。

于 2014-06-17T17:31:00.670 回答
0

设备上的某些其他进程似乎很可能在这些时间间隔内完成了一些繁重的工作,并与您的应用程序争夺 CPU 资源。

于 2014-06-17T17:21:40.060 回答