我需要项目帮助。基本上我需要测量一些排序算法的时钟周期。由于它们都使用比较,有时使用交换功能,因此我将它们设计为接受这些作为回调函数。
为了测量时钟滴答,我写道:
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都不会反映任何变化。好像从未写过引用它们的代码行。
没什么作用。在函数调用中甚至不是简单整数的增量。是否无法在模板函数内更改静态全局变量?
我不明白我在这里做错了什么。
答案 0 :(得分:3)
没什么作用。在函数调用中甚至不是简单整数的增量。
我怀疑标题文件中出现以下内容:
static clock_t t1, total;
如果是这种情况,每个翻译单元将获得两个变量的单独实例(感谢static
)。
要修复此问题,请在标头中将static
更改为extern
,然后将以下内容添加到.cpp文件中:
clock_t t1, total;
编辑以下示例说明了这一点:
根据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
答案 1 :(得分:0)
似乎有关于如何设置全局变量的错误。 (NPE的答案涵盖了这一点。)
但是,要记住的另一件事是您正在尝试衡量单个比较的性能。这取决于T
是什么,但对于大多数简单类型,这将是一个或两个CPU指令,远太小,无法使用这样的技术精确测量。
使用采样分析器会更好。使用此处的代码,您的工具比正在完成的工作要昂贵得多,这使得分析数据无用。