我有一个稍微大的功能(大约80行代码没有注释),我正在优化. 作为尝试让探查器为我工作的一部分,我拿了2块代码并将它们放在单独的函数中(这应该是暂时的,直到我可以将它们放回去)
作为尝试让探查器为我工作的一部分,我拿了2块代码并将它们放在单独的函数中(这应该是暂时的,直到我可以将它们放回去).
有趣的是这个:
我的测试用例耗时29.8秒
在我将第一个块放入一个单独的函数后,我看到由于函数调用开销导致的性能损失很小. (30.2秒)
当我将第二块代码放入一个单独的函数时,我获得了相当大的性能提升,最低可达24.2秒
第二块代码是插入到一个相当大的链表中,我打算用二叉树或其他东西替换,但这20%的改进对我来说相当混乱.
tl; dr:尝试优化代码并注意到将代码块放入单独的函数中会使性能提高20%.怎么可能?
编辑:确认在发布版本中运行
通过提取这段代码,您可以更轻松地完成此功能.也许这有助于编译器有效地编译函数.它可能减轻了注册压力,因为局部变量较少.有时,这只是巧合.随机抖动代码很可能会改变性能(两种方式).也许你恰好碰巧改善而不是恶化.
为什么“摇摇欲坠”改变了表现?它可能会改变地址对齐,分支预测,编译器查看什么是热门,什么是冷,CPU指令缓存使用.
所有这些都是从语义角度来看的实现细节.然而他们影响了表现.它们非常难以预测,因为它们工作水平很低而且非常复杂.