在重构一些代码的过程中,想要改变像这样的函数
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个元素
我正在与之合作的人不愿意使用第二个版本,因为通过6个整数的性能成本。 我很确定这是可以忽略的,考虑到循环的每次迭代都要经过很多代码,并且处理10M元素大约需要1分钟。
传递6 int的成本是否总是如此高?如果没有,我怎么能让他们改变主意呢?
编辑: 关于内联,我告诉他们如果函数被内联,那么它的答案基本上是“我们无法确定它是否会被内联”,我似乎记得这是真的(由编译器决定)
答案 0 :(得分:2)
我怀疑在合理优化的代码中,您不会发现这两种变体之间存在任何重大差异。但是,证明这将是实际更改代码并比较不同的时间。 (更重要的是,如果在一分钟内处理10M条目,那么每个项目为6微秒,那么在现代处理器上大约有30000-200000个指令 - 增加6个参数传递将不会以一种或另一种方式使用它,我会说 - 当然,除非在循环中多次调用此函数。)
是的,如果函数是内联的,结果将是两个替代方案的相同代码 - 但是你的同事说,你不能确定它是否内联 - 是真正确定它的唯一方法是看看生成的机器代码(-S或使用objdump或类似代码)。
答案 1 :(得分:2)
就性能而言,我建议您分析您的代码,看看是否存在重要差异。传递通常非常便宜并且可以自动优化,所以我怀疑你会看到可衡量的性能影响。
另外值得指出的是,这两个功能是不同的。第二个不一定使用成员变量,第一个不一定。如果您总是在比较成员变量,为什么要将它们作为参数传递?额外不必要的参数意味着更多的源代码和更大的bug范围。
答案 2 :(得分:2)
编写代码,正如Shane所说,对其进行描述,或者我更喜欢grab a few stack samples,因为您可以确切地看到正在发生的事情。
如果你在通过那些int
参数的指令中找到程序计数器,在多个样本上,那么它们花费了很长一段时间,你应该做点什么关于它。
另一方面,样本可能会告诉你其他东西是主要的时间接受者,也许你应该先解决这个问题。 然后程序会更快,如果你再次完成整个过程,它可能会回到原来的问题。