按值传递参数的性能
performance of passing arguments by value
在重构一些代码的过程中,想要更改类似的函数
bool A::function() {
return this->a == this->b || this->c == this->d || this->e == this->f || this->g == this->h ;
}
类似的东西
bool A::function(int a, int b, int c, int d, int e, int g) {
return a == b || c == d || e == this->f || g == this->h ;
}
该函数应该在主循环中每次调用,该主循环最多有10M个元素
与我一起工作的人不愿意使用第二个版本,因为通过6int的性能成本很高。考虑到循环的每次迭代都要经过大量代码,处理10M个元素大约需要1分钟,我确信这是可以忽略的。
一直按价值传递6分的成本这么高吗?如果没有,我怎么能让他们改变主意?
编辑:关于内联,我告诉他们,如果函数被内联,惩罚将为0,但他们的回答基本上是"我们不能确定它是否会被内联",我似乎记得这是真的(直到编译器)
我怀疑在经过合理优化的代码中,您不会看到这两种变体之间有任何大的区别。然而,证明这一点的是实际更改代码并比较不同的时间。(更重要的是,如果一分钟内处理1000万个条目,那么每个条目就需要6微秒,所以在现代处理器上大约有30000-200000条指令——我想说,添加6个参数传递不会以任何方式改变它——当然,除非这个函数在循环中被多次调用)。
是的,如果函数是内联的,那么两个选项的结果将是相同的代码——但你的同事说,你不能确定它是否是内联的吗——真正确定这一点的唯一方法是查看生成的机器代码(-S或使用objdump或类似的代码)。
在性能方面,我建议您对代码进行概要分析,看看是否存在重要的差异。传递int通常非常便宜,并且对自动优化开放,所以我怀疑你是否会看到可衡量的性能打击。
同样值得指出的是,这两种功能是不同的。第二个不一定使用成员变量,第一个使用。如果您总是比较成员变量,为什么要将它们作为参数传递?额外的不必要参数意味着更多的源代码和更大的bug范围。
编写代码,正如Shane所说,对其进行评测,或者我更喜欢获取一些堆栈样本,因为你可以准确地看到发生了什么。
如果在多个样本上,您在传递这些int
参数的指令中找到程序计数器,那么它们将花费大量时间,您应该对此采取措施。
另一方面,样本可能会告诉你其他事情是主要的耗时因素,也许你应该先解决这个问题。然后程序会更快,如果你重新完成整个过程,它可能会回到你原来的问题。
- 如何反转整数参数包
- 使用 const double* const 作为模板参数 - 代码性能问题
- 递归可变参数函数调用对简单 if.else 语句的性能
- 性能字符串作为函数参数
- 使用 const CString& 而不是单独使用 CString 作为函数参数是否有任何性能优势?
- 在这个C++代码中,std::string 是否可以替换为模板参数 T,如果是这样,Meyer 关于其性能成本的论点是否仍然适用?
- 可选参数的性能与可读性
- 递归函数中的许多参数会导致性能问题吗
- 使用 Lambda 时,通过捕获子句按值传递还是通过作为参数传递来传递性能更高
- 可以使用 char[] 作为参数、返回等来解决任何性能问题
- 抽象函数参数格式及其对性能的影响
- 使用函子提供函数或运算符作为C++模板参数的性能损失
- 按值传递参数的性能
- c++左值,右值,引用,参数和性能
- 未使用的默认参数会降低c++的性能吗?
- 预先知道参数时的性能比较
- 作为参数的本地阵列的性能和安全性
- 标记方法指针/引用参数常量真的会显著影响性能吗
- 函数参数中的常量基元类型是否会导致显著的性能提升?
- 指针函数参数在C++中的复制和性能