環境:
少し前に、Alexandrescu による 2001 年の DDJ の記事を見つけました: http://www.ddj.com/cpp/184403799
バッファを何らかの値に初期化するさまざまな方法を比較することです。「memset」がシングルバイト値に対して行うことと同様です。彼はさまざまな実装 (memcpy、明示的な "for" ループ、duff のデバイス) を比較しましたが、すべてのデータセット サイズとすべてのコンパイラで最適な候補を実際に見つけることはできませんでした。
見積もり:
このすべての根底には、非常に深く悲しい認識があります。2001 年は空間オデッセイの年です。(...) 箱から出して、私たちを見てください — 50 年経った今でも、私たちはメモリを埋めたりコピーしたりするのが苦手です。
質問:
- 誰かがこの問題に関するより最近の情報を持っていますか? 最近の GCC および Visual C++ の実装は、7 年前よりもパフォーマンスが大幅に向上していますか?
- 私は、寿命が 5 年以上 (おそらく 10 年以上) あり、数バイトから数百メガバイトまでの配列のサイズを処理するコードを書いています。今の選択が 5 年後も最適であるとは思えません。私は何をすべきか:
- a)システムのmemset(または同等のもの)を使用して、最適なパフォーマンスを忘れるか、ランタイムとコンパイラがこれを処理すると想定します。
- b)さまざまな配列サイズとコンパイラで一度だけベンチマークし、実行時にいくつかのルーチン間で切り替えます。
- c) プログラムの初期化時にベンチマークを実行し、正確な (?) データに基づいて実行時に切り替えます。
編集:私は画像処理ソフトウェアに取り組んでいます。私の配列アイテムはPODであり、ミリ秒ごとにカウントされます!
編集2:最初の回答をありがとう、ここにいくつかの追加情報があります:
- バッファーの初期化は、一部のアルゴリズムの合計実行時間の 20% ~ 40% を占める場合があります。
- プラットフォームは今後 5 年以上で変化する可能性がありますが、「DELL から購入できる最速の CPU」カテゴリにとどまるでしょう。コンパイラは、GCC および Visual C++ の何らかの形式になります。レーダーに埋め込まれたものやエキゾチックなアーキテクチャはありません
- 「SSE2015」が利用可能になったときに同じことをしなければならないので、MMXとSSEが登場したときにソフトウェアを更新しなければならなかった人々の話を聞きたいです... :)