2

最小/最大範囲を として、または整数のセットをRangeとして受け入れる複合コンテナをいくつか作成しました。std::pairstd::set

内部的には、入力のコピーを次のように保存しますvoid *

このコンテナーはサポートしてiteratorsおり、set を反復処理する場合と比較して、このコンテナーがどれほど高速であるかに興味がありましたstd::set

次のポリシーを使用して、テストのすべての反復ループを記述するようにしました。

  • ポストインクリメントなし (遅い)
  • コンパイラがループを完全に最適化できないことを確認してください
  • 同じものを比較する

私は次のタイミングを持っています: パフォーマンステスト

速度テスト
範囲の実行時間: [ペア]: 13.0522 ミリ秒
範囲の実行時間: [セット]: 272.54 ミリ秒
std::set の実行時間: 438.239 ミリ秒
範囲の実行時間: 通常 ループの場合: 0.000175 ミリ秒

最初 に私は驚きました、そしてあなたも願っています. なぜ私のRangeコンテナは、 のイテレータRangeが bot のイテレータstd::pair(単純に整数)std::setと そして、私の実装は、Range::iterator実際にはすべての演算子を std::set に転送しRangeますstd::set

2番目 に、これを効率的に実装することについてコメントがあります。より良いアプローチがあるかもしれませんか?

4

1 に答える 1

0

dyp のコメント: std::set の方が高速です!

速度テスト ==========================
範囲の実行時間: [ペア]: 8.69353 ミリ秒
範囲の実行時間: [セット]: 281.202 ミリ秒
RUNTIME of std::set: 220.367 ms // recopied std::set
RUNTIME of Range: Normal For Loop: 0.000196 ms

于 2014-06-05T11:45:19.097 に答える