重复函数的性能和可读性
performance and readability on repeated functions
我有一个代码
void Foo()
{
auto index = currentIndex();
if (index.isValid())
index.doSomething();
}
另一种选择
void Foo()
{
if (currentIndex().isValid())
currentIndex().doSomething();
}
第二个对我来说更可读。但它的性能如何?currentIndex()
在当前流行的编译器中计算两次吗?如果currentIndex()
是一个需要一些CPU时间的大函数,编译器是否会将第二个函数优化为第一个函数?
第一个可能会有更好的性能,IMO更可读,因为如果你只是单独调用currentIndex()
,你就没有关于它的信息。如果你把它分配给一个变量,你就有了它以备将来使用。
编译器将没有机会优化调用,原因有很多
- 第一次调用可能会更改下一次调用的结果
- 对函数进行两次调用可以更改程序的状态
- 可能还有很多其他我想不出来的原因
总之,你没有理由不使用第一个版本,我可以保证大多数人也会觉得这个版本更可读。将数据分配给一个名称是现代编程的基石之一,因此,如果当数据没有名称时,它对你来说更可读,你可能想习惯于具有名称的变量
另一个注意事项是,为了让它更可读,不要使用auto,这更好地保存在模板编程中,因为你自己可能很难弄清楚类型。
对我来说,第一个选项在性能方面没有任何问题,这是我更喜欢的。
也就是说,这完全取决于上下文、使用和currentIndex()
的成本。如果currentIndex()
是一个平凡的getter,而Foo()
没有在某个重循环中被调用,那么就没有什么区别(如果有的话)。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 可选参数的性能与可读性
- 重复函数的性能和可读性
- 在不损失性能的情况下提高可读性