メモリを割り当てている間は常に新しい読み取りが遅くなりますが、それがどれほど遅いかはわかりません。だから私はいくつかの研究とテストを始めました。
ベクトルであるバッファがあるとします(たとえば、イーサネットレシーバ用)。
- このバッファーをクラスのメンバーにして、データを入力してから、このバッファーをユーザー定義のバッファーにコピーできます。
- 新しいバッファを作成し、それをユーザー定義に移動できます。
だから今私の質問は、どちらが速かったかです。ネットを検索している間、私は実際にベンチマークや何か他のものを見つけませんでした. だから私はいくつかのテストを開始しました。
2つのvarintはレシーバーではありません!
バリアントのコピー
auto time = GetTickCount();
std::vector<int> vec;
std::vector<int> tmp(250);
for(int i=0; i<10000; i++) {
for(int i=0; i<1000; i++) {
vec.insert(vec.end(), tmp.begin(), tmp.end());
//std::copy(tmp.begin(), tmp.end(), std::back_inserter(vec1));
}
vec.clear();
}
std::cout << GetTickCount() - time << std::endl;
バリアントを移動
auto time = GetTickCount();
std::vector<std::vector<int> > vec;
for(int i=0; i<10000; i++) {
for(int i=0; i<1000; i++) {
std::vector<int> tmp(250);
vec.push_back(std::move(tmp));
}
vec.clear();
}
std::cout << GetTickCount() - time << std::endl;
メモリの割り当てがハードウェア、OS、およびメモリ管理に依存していることはわかっていますが、既存のものをコピーするよりも、新しいメモリを作成して移動する方が良いと言える平均時間はありますか? 私のテストでは、移動とほぼ同時に 250 要素のベクトルを処理する必要があり、250 要素を超えると、コピー バリアントは移動バリアントよりも遅くなることがわかりました。確かに私のテストでは、移動バリアントはベクトルのベクトルであり、反復はより困難ですが、これは(ほとんどの)私の場合は問題になりません。また、テストはintであり、質問を複雑にする構造体やクラスではありません。
また、私のテストは(高速で汚い)Windowsマシン上にあります。私の関心は、通常のハードウェアと通常のシステム (windows、linux、mac) の平均時間 (または私の状態ではサイズ) です。
テストを受けて、400 を超える要素をコピーするのは、新しい要素を作成するよりも遅いと言えますか?
編集:
Neil Kirk がランダムなサイズ割り当てを試すようにアドバイスしてくれたので、そうしました。また、テストと約1000要素に増加した平均サイズの間に割り当てを行う(ただし削除はしない)他のものを挿入しました。
特にこれ(およびサブリンク)とこれ(唯一のものであることに加えて)を読んだ後、私はMats Peterssonの答えを受け入れます。しかし、1つ追加があります。評価がなければ、それが時期尚早の最適化であるかどうかを知ることはできません。alloc に 100000 要素のコピーと同じ時間がかかる場合は、決して使用しません。それ以外の場合は、10 要素のコピーと同じ時間がかかる場合は、常に使用します。しかし、ボトルネックとしてネットワークがあるネットワーク シナリオでの 1000 要素の概算値では、時期尚早の最適化であると言えます。私のコンセプトではより便利なので、ne 割り当てバリアントを使用することにしました。