標準ライブラリのソート関数にテレメトリを追加しようとしています。スワップ、移動(スワップによって呼び出されるものを含む)の数、およびstd::sort()
およびstd::stable_sort()
関数の比較操作を数えたいと思います。ソートの基本的な基本操作を正しく測定する
そうするためには、私は、次の手順を取っています:
- は増分に比較関数オブジェクトのラッパーを作成し、私は
- を測定する操作の数をカプセル化するための構造体を作成します。比較は
std::swap()
機能を特化し、スワップ回数 - は、カスタム移動機能を作成し、ステップ#3 で作成し、専門のstd ::スワップ()関数からそれを呼び出すインクリメント
- を数えます
- 最後に、私は
std::stable_sort()
がどのスワップを起動する可能性はないので、正しいかもしれ次の出力を取得std::sort()
とstd::stable_sort()
を実行し、統計情報に
を収集します。
std::sort(): Moves: 68691, Swaps: 22897, Comparisons: 156959
std::stable_sort(): Moves: 0, Swaps: 0, Comparisons: 183710
しかし、私は交換した場合
std::move()
機能を特化し、移動カウント をインクリメントする。これにより、上記#4ステップ
出力は間違いなく右ではありませんstd::sort()
0移動し、持っている:さらに、私のコンパイラの(ダーウィン16.5.0にLLVM 8.1.0)がstd::stable_sort()
の実装は移動して乗っている
std::sort(): Moves: 0, Swaps: 22897, Comparisons: 156959
std::stable_sort(): Moves: 0, Swaps: 0, Comparisons: 183710
を()コール。だから、私はまた、出力で非ゼロの移動カウントを期待しています。
(/秒壊れた場合の抜粋に続く最初のケースのためのMVCE)以下の私のコードを見て、あなたはこれらの質問に答えることができるかどうかを確認してください:
- がための私の全体的なアプローチですが合理的な統計情報の収集?
- はなぜ第二ケースが壊れているとどのように私はそれを修正できますか?
- (以下冗長作る)比較ファンクタのラッパー、少なくともSTD :: refの()部分を簡素化する方法はありますか?(最初の場合)
基本コード:
namespace std {
// Add specialization for std::move()
template<>
inline
std::remove_reference<int>::type&&
move<int>(int&& x) noexcept
{
test::__sort_stats.incr_count_moves();
return static_cast<std::remove_reference<int>::type&&>(x);
}
// Invoke std::move() instead of test::move from the specialized std::swap() function
template<>
inline
void
swap<int>(int& a, int&b) noexcept(is_nothrow_move_constructible<int>::value
&& is_nothrow_move_assignable<int>::value)
{
test::__sort_stats.incr_count_swaps();
using std::move;
int temp(move(a));
a = move(b);
b = move(temp);
}
}
私の推測がある、それは 'のstd :: sort'の体から表示されていないので、あなたの専門分野で使用されていません。 '#include'の前に移動すると動作が変わるかもしれません。ただし、名前空間 'std'のテンプレートは、ユーザ定義型に対してのみ特殊化することができます。それ以外の場合、プログラムは未定義の動作を示します。 –
個人的には、私がこの作業をしようとすると、自分のクラスのインスタンスをソートせず、コピーと移動のコンストラクタと代入演算子だけでなく、 'operator <'を簡単に測ることができます。 @IgorTandetnik。 –
ああ、私はあなたが参照していると思う_ "宣言がユーザー定義の型に依存する場合にのみ、標準ライブラリテンプレートのテンプレート特殊化を名前空間stdに追加することは許可されています..." [link:http: /en.cppreference.com/w/cpp/language/extending_std#Adding_template_specializations)。私はカスタムタイプで私の運動を繰り返します。ありがとう! –