0

我有多个相同长度的数组,我希望用零填充。让我们看看两种方法:

1)

int i;
for(i=0;i<ARRAYSLENGTH;i++){
    arr1[i]=0;
    arr2[i]=0;
    arr3[i]=0;
    ...
}

2)memset所有数组归零。

在最近的一次代码审查中,我被要求将选项 1 更改为选项 2。这让我想知道,这些方法中哪个更好?主要是:

2 是否被认为比 1 更具可读性?

这两种方法在效率方面如何比较?(考虑memset通常在汇编中实现,但方法 1 只为多个数组增加一次计数器)。

4

3 回答 3

6

您的方法 1(for循环)对缓存不利。

因为arr1, arr2,arr3可能不在内存中彼此靠近,并且很可能不会一起在缓存中,您可能会经常出现缓存未命中,并且 CPU 将不得不不断地从内存中获取新的片段,只是为了将它们设置为零。

通过执行一组memset操作,您将立即从缓存中命中ALL of arr1,几乎可以肯定是完全来自缓存。然后,您将arr2非常快速地缓存和设置所有内容,等等。

那,并且因为memset可能有组装技巧和优化以使其更快,所以我肯定更喜欢选项 2 而不是选项 1。

于 2012-12-28T14:42:54.533 回答
0

我认为大多数程序员应该能够阅读 memset 并知道它在做什么,因此可读性应该不是问题。对于大多数现代编译器,您可能不会看到太大的性能差异,但我会使用 memset,因为这就是它的用途。

于 2012-12-28T14:43:47.903 回答
0

您甚至可以使用 bzero 代替更具体的 memset

于 2012-12-28T15:11:06.677 回答