我有一个方法可以执行一些过滤操作。此方法在循环中调用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);
}
答案 0 :(得分:2)
很可能是垃圾收集器。
由于这是一个数千次的紧密循环,你可能真的想要优化你的内存分配。
Android documentation中有一些提示,但基本要点是:
不要做你不需要做的工作。
如果可以避免,请不要分配内存。
这里可能有用的一些提示:
使用静态最终常量
我在你的代码中看到了很多常量。如果您使用静态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);
}
基本上,这会导致它使用“常量”指令,而不是字段查找。
注意:此优化仅适用于基本类型和字符串常量,而不适用于任意引用类型。尽管如此,最好尽可能地声明常量静态最终值。
链接页面上有很多其他提示,比如避免浮点数,但我会将其作为练习留给读者。这应该有所帮助。
答案 1 :(得分:0)
设备上的某些其他进程似乎很可能会在这些时间间隔内完成一些繁重工作,并与您的应用争用CPU资源。