我有一个代码需要检查大小为2048的给定缓冲区是否全为零。现在我进行一次遍历,但想知道是否有更快的方法来检查是否所有包含0.是否有更快的方法?我所拥有的密码如下:
static int isSilent(Uint8* buf, int length){
int i;
for(i=0; i<length; i++)
if(buf[i] != 0) return 0;
return 1;
}
编辑: 我正在进行实时音频处理,因此缓冲区尺寸很小,并试图减少延迟。只是试图探索更快的方式。谢谢。
答案 0 :(得分:3)
不,一般来说,如果你想检查整个数组,你必须检查整个数组。如果您事先了解有关阵列的信息,那么您当然可以对此进行优化。
答案 1 :(得分:2)
O(n) is the Big-O complexity for a linear scan
即使在更大的数据对齐中处理(例如,在字或更大的边界上进行处理),仍然会考虑恒定的时间改进。如果适用,执行此类优化/技巧 1 可能会使挂钟时间更长,并且运行速度更快&#34;但不要影响O(n)界限。
但是,请确保这是一个相关的问题,因为2048个元素很小,一旦检测到失败的情况,循环就会终止。
1 在这种情况下可以使用各种技巧。其中一个最值得注意的例子是memcpy,在实现such as this中显示,它使用&#34;字对齐&#34;循环。
答案 2 :(得分:1)
从理论上讲,没有这样的方法。对于未排序的数组,您必须检查它的每个元素,因此这样的操作具有Θ(n)
的复杂性。在实践中,您可以使用SIMD概念进行并行处理,但这对于这种简单(小?)任务来说似乎有些过分。基本上你拥有的处理器越多,你就可以获得更高的加速。但假设有一些k ∈ ℕ
,其中k > 0
是处理器数量,对于任意大Θ(n)
,您仍然有n
的时间复杂度。