我有多个相同长度的数组,我希望用零填充.让我们看看两种方法:
int i;
for(i=0;i<ARRAYSLENGTH;i++){
arr1[i]=0;
arr2[i]=0;
arr3[i]=0;
...
}
Run Code Online (Sandbox Code Playgroud)
memset所有数组归零.在最近的一次代码审查中,我被要求将选项1更改为选项2.这让我想知道,哪种方法更好?主要是:
2被认为比1更可读吗?
这两种方法在效率方面有何比较?(考虑memset通常在汇编中实现,但方法1仅为多个数组递增计数器一次).
你的方法1(for循环)对缓存不好.
由于arr1,arr2,arr3可能不是在任何地方接近彼此在内存中,并且很可能不会在缓存在一起,你可以有频繁的缓存缺失,CPU将必须不断地从内存中取新的作品,只是将它们设置为零.
通过这样做一组memset动作,你打所有的arr1完全从缓存,一次,几乎可以肯定.然后你将快速缓存和设置所有arr2,等等.
那,并且因为memset可能有装配技巧和优化使其更快,我肯定更喜欢选项2而不是选项1.