我的问题来自Proper way of designing functions with and without debug information in C++。我想比较以下功能的效率:
功能1
bool my_func1(int arg1, int &output, std::vector<int> &intermediate_vec);
{
// do something
}
当我使用这个功能时,我将按以下方式调用它:
int arg;
int output;
std::vector<int> intermediate_vec;
my_func1(arg,output,intermediate_vec);
功能2
bool my_func2(int arg1, int &output);
{
std::vector<int> intermediate_vec
return my_func1(arg1, output, intermediate_vec);
}
当我使用这个功能时,我将按以下方式调用它:
int arg;
int output;
my_func2(arg,output);
我的问题是:这两个功能效率是否相同?
答案 0 :(得分:2)
这是需要详细解答的详细问题之一。
特别是如果编译器能够内联func1
或func2
以避免额外的调用开销(也就是说,函数以这样的方式声明它们可以是编译器从调用代码“看到”。)
唯一可能存在较大差异的是,如果您可以避免构建/破坏intermediate_vec
- 例如你在循环中重复使用同一个(但很可能你在这种情况下“重置”向量,这是破坏向量的主要部分)。
差异如何,作为总时间的一部分,取决于do something
实际上正在做什么func1
。
但是,与所有性能问题一样,有必要使用性能基准来比较两者。确保使用实际代码的优化级别对其进行编译。
答案 1 :(得分:1)
几乎没有任何关于函数性能的信息只能来自它的签名。我可以使用其中一个签名编写您能想象到的最快和最慢的函数。
在第二个选项中,您将向该函数添加第三个参数。你需要那个参数吗?如果需要,请使用该选项。如果不这样做,请使用第一个。
答案 2 :(得分:1)
这个问题真的很傻;这真的取决于
使用intermediate_vec
制作。如果它是的一部分
接口,你需要使它成为一个参数,并记录它
前后条件。如果它不是界面的一部分,
然后使它成为一个参数暴露函数的内部
哪个不应该暴露。效率(程序员除外)
效率)不会进入它。
除此之外,比较效率的唯一方法(至少在 这些案例是衡量的。
最后,如果你经常紧张地调用该函数
执行循环,并且分析器显示构造
intermediate_vec
(在第2版中)导致严重延迟,
你可能会通过使用第一个版本,并移动实际
循环外的矢量;矢量可能会到达它的
最大容量相当快,在那之后,会有
没有进一步的动态分配。但这种变化是
只有在绝对的情况下才应该采取的措施
必要性,当程序不足够快时,和
profiler显示创建向量的分配是
这是一个重要原因。我会强调你
可能;很多仍取决于编译器如何优化,以及
如何实施std::vector
。
答案 3 :(得分:0)
测量cpu时间以获得实际测量值
答案 4 :(得分:0)
由于您将向量作为引用传递(而不是创建临时副本),因此任何性能差异都可以忽略不计(编译器甚至可能将其内联到等效的东西 - 如果不是,则可能会产生一些堆栈帧开销)。
它还取决于做某事实际上做了什么,以及如何调用这些函数(即它是一些紧密的循环)。
最好分析并查看。
答案 5 :(得分:0)
优化函数的行为通常非常难以预测。完成所有功能后,可以精确显示相同的性能特征。它们可能没有内联,或者某些优化可能在任何一种情况下都会失败,并且任何情况下都可能会有更差唯一能够认真对待这样的事情的方法是使用可靠的分析器在不同的设置中测量性能。