【发布时间】:2015-09-04 19:04:21
【问题描述】:
我写了一个函数模板来测量时间:
#include <ctime>
template <typename FUNCTION,typename INPUT,int N>
double measureTime(FUNCTION f,INPUT inp){
// double x;
double duration = 0;
clock_t begin = clock();
for (int i=0;i<N;i++){
// x = f(inp);
f(inp);
}
clock_t end = clock();
// std::cout << x << std::endl;
return double(end-begin) / CLOCKS_PER_SEC;
}
我是这样使用它的:
#include <iostream>
typedef std::vector<double> DVect;
double passValue(DVect a){
double sum = 0;
for (int i=0;i<a.size();i++){sum += sum+a[i];}
return sum;
}
typedef double (*passValue_type)(DVect);
int main(int argc, char *argv[]) {
const int N = 1000;
const int size = 10000;
std::vector<double> v(size,0);
std::cout << measureTime<passValue_type,DVect,N>(passValue,v) << std::endl;
}
目的是可靠地测量不同功能的 CPU 时间,例如值传递与引用传递。实际上,它似乎工作得很好,但是,有时结果时间太短而无法测量,结果我只得到 0。为了确保调用该函数,我打印了调用的结果(参见上面代码中的 cmets)。这是我想避免的,我想让模板尽可能简单,所以我的问题是:
我怎样才能确保函数真的被调用并且没有被优化掉(因为没有使用返回值)?
【问题讨论】:
-
您可以尝试应用一些副作用,例如更新用作返回值的静态局部变量。当然,如果你真的想在多线程应用程序中使用返回的值,那是行不通的。
-
在我看来,您的
measureTime函数会告诉您代码实际执行所需的时间。如果您担心按值传递太慢,那么您应该对您关心的实际代码进行基准测试,您相当确定它不会被优化,并且您不会遇到这个问题。 -
@Brian 我对此并不关心,我只是想进行一些实验以获得对差异的定量感觉,但是我的测试用例要么需要很长的时间才能通过价值,要么很少通过参考测量。
标签: c++ performance optimization