重复函数的性能和可读性

performance and readability on repeated functions

本文关键字:可读性 性能 函数      更新时间:2023-10-16

我有一个代码

void Foo()
{
    auto index = currentIndex();
    if (index.isValid())
        index.doSomething();
}

另一种选择

void Foo()
{
    if (currentIndex().isValid())
        currentIndex().doSomething();
}

第二个对我来说更可读。但它的性能如何?currentIndex()在当前流行的编译器中计算两次吗?如果currentIndex()是一个需要一些CPU时间的大函数,编译器是否会将第二个函数优化为第一个函数?

第一个可能会有更好的性能,IMO更可读,因为如果你只是单独调用currentIndex(),你就没有关于它的信息。如果你把它分配给一个变量,你就有了它以备将来使用。

编译器将没有机会优化调用,原因有很多

  1. 第一次调用可能会更改下一次调用的结果
  2. 对函数进行两次调用可以更改程序的状态
  3. 可能还有很多其他我想不出来的原因

总之,你没有理由不使用第一个版本,我可以保证大多数人也会觉得这个版本更可读。将数据分配给一个名称是现代编程的基石之一,因此,如果当数据没有名称时,它对你来说更可读,你可能想习惯于具有名称的变量

另一个注意事项是,为了让它更可读,不要使用auto,这更好地保存在模板编程中,因为你自己可能很难弄清楚类型。

对我来说,第一个选项在性能方面没有任何问题,这是我更喜欢的。

也就是说,这完全取决于上下文、使用和currentIndex()的成本。如果currentIndex()是一个平凡的getter,而Foo()没有在某个重循环中被调用,那么就没有什么区别(如果有的话)。