2013-03-14 56 views
0

我需要项目帮助。基本上我需要测量一些排序算法的时钟滴答。由于他们都使用比较和有时交换功能,我设计他们接受这些作为回调函数。模板函数中的全局值不会改变[C++]

为了测量时钟滴答我写道:

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; 
} 

当我实际运行的算法,无论是全部或T1反映任何改变任何责任。仿佛引用它们的代码行从来没有写过。

没有用。在函数调用中甚至没有增加一个简单的整数。

难道静态全局变量不能在模板函数内改变吗?

我不明白我在做什么错在这里。

+0

你是从同一个文件调用吗?它是否在.h文件中? – littleadv 2013-03-14 07:18:30

+1

考虑将'static'改为'extern',并在'main()'源文件(或其他合适的位置)声明**一个** * real *的一组变量。 – WhozCraig 2013-03-14 07:22:21

+0

考虑衡量一百万个对象的比较,而不是一个对象。请使用其他的但全局的东西。 – 2013-03-14 07:26:56

回答

3

没有用。在函数调用中甚至没有增加一个简单的整数。

我怀疑下面出现在文件:

static clock_t t1, total; 

如果是这样的话,每个翻译单元会得到这两个变量的其自己的独立实例(感谢static)。

要解决,在头改变staticextern,并添加以下的.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 
+0

它的确如此。但将其改为正常的全球变量也不会导致变化。我不能把这些放在我的cpp文件中,因为编译器会认为这些值不存在 – Yuma 2013-03-14 07:22:53

+0

@Yuma:这是一个单独的问题。您正在尝试测量的时间少于单个时钟的时间。 – NPE 2013-03-14 07:23:43

+2

@Yuma老实说,这是写的方式,它将花费更长的时间* *测量比执行实际评估被测量。所以无论如何你的数字都会非常不准确。 – WhozCraig 2013-03-14 07:24:50

0

似乎有一个错误机智h你如何设置全局变量。 (NPE的回答涵盖了这个。)

但是,另一个要记住的是,你正在试图测量单一比较的性能。这取决于什么是T,但对于大多数简单类型,这将是一个或两个CPU指令,这是远的太小,不能用这样的技术精确测量。

使用采样分析器会更好。用你在这里的代码,你的仪器比正在完成的工作要昂贵得多,这使得分析数据无用。

+0

这只是一个例子。我在交换/交换功能中也使用了它。即使交换一个巨大的数组,时钟滴答也不会变成除零之外的任何东西。 – Yuma 2013-03-14 07:30:09

+0

如果您在'std :: vector'上使用'std :: swap',则数组大小无关紧要;交换操作只是交换几个指针(可能是几十个操作码)。 – StilesCrisis 2013-03-14 14:33:09