C++ 函数中的变量与C+;中用作参数的变量之间的差异+;

C++ 函数中的变量与C+;中用作参数的变量之间的差异+;,c++,performance,C++,Performance,我的问题来自。我想比较以下功能的效率: 职能1 bool my_func1(int arg1, int &output, std::vector<int> &intermediate_vec); { // do something } 我的问题是:这两个功能是否具有相同的效率 你不能仅仅从函数的签名来判断函数的性能。我可以用这些签名中的任何一个来编写你能想象的最快和最慢的函数 在第二个选项中,您将向函数添加第三个参数。你需要那个参数吗?如果您需要,

我的问题来自。我想比较以下功能的效率:

职能1

bool my_func1(int arg1, int &output, std::vector<int> &intermediate_vec);
  {
     // do something
  }

我的问题是:这两个功能是否具有相同的效率

你不能仅仅从函数的签名来判断函数的性能。我可以用这些签名中的任何一个来编写你能想象的最快和最慢的函数


在第二个选项中,您将向函数添加第三个参数。你需要那个参数吗?如果您需要,请使用该选项。如果不知道,请使用第一个。

仅从函数的签名,几乎无法了解函数的性能。我可以用这些签名中的任何一个来编写你能想象的最快和最慢的函数


在第二个选项中,您将向函数添加第三个参数。你需要那个参数吗?如果您需要,请使用该选项。如果没有,请使用第一个。

测量cpu时钟时间以获得真实测量值

测量cpu时钟时间以获得真实测量值

由于您将向量作为参考传递(而不是创建临时副本),因此任何性能差异都可以忽略不计(编译器甚至可能将其内联到某个等效的对象中——如果不是,则可能会产生一些堆栈帧开销)

它还取决于“做某事”实际上做了什么,以及这些函数是如何被调用的(也就是说,它是一个紧密的循环)


最好分析并查看。

因为您将向量作为引用传递(而不是创建临时副本),所以任何性能差异都可以忽略不计(编译器甚至可能将其内联到某个等效的对象—如果不是,可能会产生一些堆栈帧开销)

它还取决于“做某事”实际上做了什么,以及这些函数是如何被调用的(也就是说,它是一个紧密的循环)


最好描述并查看。

这是需要详细信息才能准确回答的问题之一

应该没有什么区别,尤其是如果编译器能够内联
func1
func2
以避免额外的调用开销(即,函数的声明方式使编译器可以从调用代码中“看到”它们)

唯一会有更大区别的时候是,如果你能避免构造/破坏
中间向量
——例如,你在循环中重复使用同一个向量(但在这种情况下,你很可能会“重置”向量,这是破坏向量的主要部分)

作为总时间的一部分,差异有多大,取决于
func1
做某事的确切内容


但是,与所有性能问题一样,有一个性能基准来比较两者是值得的。请确保您按照实际代码的优化级别编译它。

这是需要详细信息才能准确回答的问题之一

应该没有什么区别,尤其是如果编译器能够内联
func1
func2
以避免额外的调用开销(即,函数的声明方式使编译器可以从调用代码中“看到”它们)

唯一会有更大区别的时候是,如果你能避免构造/破坏
中间向量
——例如,你在循环中重复使用同一个向量(但在这种情况下,你很可能会“重置”向量,这是破坏向量的主要部分)

作为总时间的一部分,差异有多大,取决于
func1
做某事的确切内容


但是,与所有性能问题一样,有一个性能基准来比较两者是值得的。请确保编译时使用实际代码的优化级别。

优化函数的行为通常是不可预测的。毕竟,函数可能是内联的,并且显示出完全相同的性能特征。它们可能不是内联的,或者某些优化在任何情况下都可能失败,并且任何情况下都可能会有更差的性能。认真解决这类问题的唯一方法是在不同设置下使用可靠的探查器测量性能。

优化函数的行为通常是非常不可预测的。毕竟,您的函数可能是内联的ned和show完全相同的性能特征。它们可能不是内联的,或者某些优化可能在任何情况下都会失败,任何情况下都可能会有更差的性能。认真解决这类问题的唯一方法是在不同的设置下使用可靠的探查器测量性能。

这个问题真的很愚蠢;它真的要看天气了 如果它是 接口,您需要将其作为参数,并记录其 前置和后置条件。如果它不是接口的一部分, 然后将其作为参数公开函数的内部 不应该公开的。效率(程序员除外 效率)不参与其中

除此之外,比较效率的唯一方法(至少在 这类情况)是要衡量的

最后,如果您以紧凑、频繁的方式调用函数 执行循环,探查器显示
intermediate_vec
(第2版)正在造成严重延迟, 使用第一个版本并移动实际的 循环外的向量;向量可能会到达其 最大容量相当快,之后,将有 没有进一步的动态分配。但这种变化是 只有在绝对危险的情况下才应该采取的行动 必要性,当程序不够快时,以及 分析器显示创建向量时的分配是 重要的
int arg;
int output;
std::vector<int> intermediate_vec;
my_func1(arg,output,intermediate_vec);
  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);