测量将参数传递给函数所需的时间

时间:2017-04-24 17:44:16

标签: c++ time arguments

有没有办法通过传递参数来衡量函数花费的时间?我的想法是测量函数的主体和整个函数本身。这是正确的方法吗? 下面的伪代码:

int main(){
  int start = time.now();
  // passing by value
  int timeOfFunc = foo(vector<my_object> huge_vector, vector<my_object2> huge_vector2);
  int end = time.now();
  int timeSpentPassingArgs = (end - start) - timeOfFunc; // getting time it takes to pass the argument?
}

int foo(vector<my_object> huge_vector, vector<my_object2> huge_vector2)
{
 int start = time.now();
 // body of the foo function
 int end = time.now();
 return (end - start);
}

2 个答案:

答案 0 :(得分:1)

首先,我建议打印进行呼叫的功能的汇编语言。这可以让您了解传递变量所需的工作。

为了获得有意义的配置文件,您应该测量函数调用之前的时间以及之后的时间并执行1E6次迭代。然后,您可以获得调用函数所需的平均执行时间。

另一种方法是查找函数调用中使用的每个汇编指令所需的时钟周期。由于处理器如何执行汇编语言指令(它可能并行执行,代码可能或可能不在指令缓存中等),这可能不准确。

编辑1:示波器
示波器是衡量性能的好工具。在嵌入式系统区域中,代码写入测试点(或LED)。例如,LED将在函数调用之前打开,在函数调用之后关闭。示波器探头将连接到LED。然后可以使用ocope来测量LED的持续时间。同样,需要执行许多迭代才能获得更好的平均值。

答案 1 :(得分:0)

我看不出你的方法有什么问题,只是你的时间将包括在函数中调用time.now()两次所需的时间。与复制的成本相比,这应该是非常小的。

您可以尝试的其他选项如下(使用伪代码):

function(parameters)
{
    return time.now();
}

// calling code
time start = time.now();
time end = function(paramters);
time total_time = end - start;

这应该告诉你确切地调用函数和复制参数需要多长时间。我不确定编译器是否允许/可以优化掉未使用的参数副本,但如果确实如此,你应该只得到零。