1

在重构一些代码的过程中,想改变这样的功能

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,但他们的回答基本上是“我们不能确定它是否会被内联”,我似乎记得这是真的(直到编译器)

4

3 回答 3

2

我怀疑您不会在合理优化的代码中看到这两个变体之间的任何大差异。但是,证明这一点的方法是实际更改代码并比较不同的时间。(更重要的是,如果在一分钟内处理 10M 个条目,则每个项目需要 6 微秒,因此现代处理器上大约有 30000-200000 条指令 - 添加 6 个参数传递不会以一种或另一种方式让步,我会说- 除非这个函数在循环中被多次调用,当然)。

是的,如果函数是内联的,结果将是两个替代方案的相同代码 - 但是你的同事说,你不能确定它是否内联 - 真正确定它的唯一方法是拥有查看生成的机器代码(-S 或使用 objdump 或类似的)。

于 2013-07-17T11:33:48.627 回答
2

在性能方面,我建议你分析你的代码,看看是否有重要的区别。传递整数通常非常便宜并且对自动优化开放,所以我怀疑你会看到可衡量的性能损失。

还值得指出的是,这两个功能是不同的。第二个不一定使用成员变量,第一个使用。如果您总是比较成员变量,为什么将它们作为参数传递?额外的不必要参数意味着更多的源代码和更大的错误范围。

于 2013-07-17T11:40:31.417 回答
2

编写代码,正如 Shane 所说,对其进行分析,或者我更喜欢获取一些堆栈示例,因为您可以确切地看到发生了什么。

如果您在传递这些参数的指令中发现程序计数器int,在多个样本上,那么它们会花费大量时间,您应该对此采取一些措施。

另一方面,样本可能会告诉您其他东西是主要的耗时因素,也许您应该先解决这个问题。然后程序会更快,如果您再次执行整个过程,它可能会回到您最初的问题。

于 2013-07-17T11:48:52.207 回答