有没有办法通过传递参数来衡量函数花费的时间?我的想法是测量函数的主体和整个函数本身。这是正确的方法吗? 下面的伪代码:
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);
}
答案 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;
这应该告诉你确切地调用函数和复制参数需要多长时间。我不确定编译器是否允许/可以优化掉未使用的参数副本,但如果确实如此,你应该只得到零。