0

プロジェクトで助けが必要です。基本的に、いくつかの並べ替えアルゴリズムのクロック ティックを測定する必要があります。それらはすべて比較関数を使用し、場合によってはスワップ関数を使用するため、これらをコールバック関数として受け入れるように設計しました。

私が書いたクロックティックを測定するには:

static clock_t t1, total;

template<typename T>
bool less_default(T & left, T & right){
    t1 = clock(); 
    bool v = left < right; 
    t1 = clock() - t1;
    total += t1
    return v;
}

実際にアルゴリズムを実行すると、total にも t1 にも変化がまったく反映されません。それらを参照するコード行が書かれていないかのように。

何も機能しません。関数呼び出しでの単純な整数のインクリメントでさえありません。

テンプレート関数内で静的グローバル変数を変更できないということですか?

ここで何が間違っているのかわかりません。

4

2 に答える 2

3

何も機能しません。関数呼び出しでの単純な整数のインクリメントでさえありません。

ヘッダーファイルに次のように表示されると思われます。

static clock_t t1, total;

その場合、各翻訳単位は 2 つの変数の独自の個別のインスタンスを取得します (おかげでstatic)。

修正するには、ヘッダーを に変更staticextern、.cpp ファイルに次を追加します。

clock_t t1, total;

これを示すEDITサンプルに従う:

OPのリクエストによると、これはテンプレートコンパレーターとこの回答のレシピを使用して、実行中のクロックの合計を宣言および管理する短い例です。

main.h

#ifndef PROJMAIN_DEFINED
#define PROJMAIN_DEFINED

extern clock_t total;

template<typename T>
bool less_default(const T& left, const T& right)
{
    clock_t t1 = clock();
    bool res = (left < right);
    total += (clock() - t1);
    return res;
};

#endif

main.cpp

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include "main.h"
using namespace std;

clock_t total = 0;

int main()
{
    static const size_t N = 2048;
    vector<int> values;
    values.reserve(N);
    std::srand((unsigned)time(0));

    cout << "Generating..." << endl;
    generate_n(back_inserter(values), N, [](){ static int i=0; return ++i;});

    for (int i=0;i<5;++i)
    {
        random_shuffle(values.begin(), values.end());
        cout << "Sorting ..." << endl;
        total = 0;
        std::sort(values.begin(), values.end(), less_default<int>);
        cout << "Finished! : Total = " << total << endl;
    }
    return EXIT_SUCCESS;
}

出力

Generating...
Sorting ...
Finished! : Total = 13725
Sorting ...
Finished! : Total = 13393
Sorting ...
Finished! : Total = 15400
Sorting ...
Finished! : Total = 13830
Sorting ...
Finished! : Total = 15789
于 2013-03-14T07:18:56.320 に答える
0

グローバルの設定方法にバグがあるようです。(NPEの回答はこれをカバーしています。)

ただし、もう 1 つ注意すべき点は、単一の比較のパフォーマンスを測定しようとしているということです。内容にTもよりますが、ほとんどの単純なタイプの場合、これは 1 つまたは 2 つの CPU 命令であり、このような手法で正確に測定するには小さすぎます

サンプリング プロファイラーを使用する方がはるかに優れています。ここにあるコードでは、インストルメンテーションは実行中の作業よりもはるかに高価であり、プロファイリング データが役に立たなくなります。

于 2013-03-14T07:22:20.097 に答える