0

ゼロで埋めたい同じ長さの配列が複数あります。それを行う2つの方法を見てみましょう。

1)

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

2)memsetすべての配列をゼロにします。

最近のコードレビューで、オプション1をオプション2に変更するように求められました。これは、これらの方法のどちらが優れているのか疑問に思いました。主に:

2は1よりも読みやすいと見なされますか?

これらの2つの方法は、効率の点でどのように比較されますか?(考慮memsetは通常アセンブリで実装されますが、方法1は複数の配列に対して1回だけカウンターをインクリメントします)。

4

3 に答える 3

6

メソッド1(forループ)はキャッシュに適していません。

、、arr1はメモリ内で互いに近くにない可能性があり、一緒にキャッシュに存在しない可能性が非常に高いため、キャッシュミスが頻繁に発生する可能性があり、CPUはメモリから新しいピースを常にフェッチする必要がありますarr2arr3零。

一連の操作を実行することにより、ほぼ確実にキャッシュからすべてを一度にヒットmemsetます。次に、すべてを非常にすばやくキャッシュして設定します。arr1arr2

memsetそれと、それをより速くするための組み立てのトリックと最適化があるかもしれないので、私は間違いなくオプション1よりもオプション2を好むでしょう。

于 2012-12-28T14:42:54.533 に答える
0

ほとんどのプログラマーはmemsetを読んで、それが何をしているのかを知ることができるはずなので、読みやすさは問題にならないはずです。最近のほとんどのコンパイラでは、パフォーマンスの違いはあまり見られないでしょうが、私はmemsetを使用します。

于 2012-12-28T14:43:47.903 に答える
0

より具体的なmemsetの代わりにbzeroを使用することもできます

于 2012-12-28T15:11:06.677 に答える