我有一个稍微大的功能(大约80行代码没有注释),我正在优化。
作为尝试让探查器为我工作的一部分,我拿了2块代码并将它们放在不同的函数中(这应该是暂时的,直到我可以把它们放回去)。
有趣的是: 我的测试案例耗时29.8秒 在我将第一个块放入一个单独的函数后,我看到由于函数调用开销导致的性能损失很小。 (30.2秒) 当我将第二块代码放入一个单独的函数时,我获得了相当大的性能增益,低至24.2秒
第二块代码是插入一个相当大的链表,我计划用二叉树或其他东西替换,但这20%的改进对我来说相当混乱。
tl; dr:尝试优化代码并注意到将代码块放入单独的函数中会使性能提高20%。这怎么可能?
编辑:确认在发布版本中运行
答案 0 :(得分:6)
通过提取这段代码,您可以更轻松地完成此功能。也许这有助于编译器有效地编译函数。它可能减轻了注册压力,因为局部变量较少。
有时,这只是巧合。 随机摇晃的代码很可能会改变性能(两种方式)。也许你恰好碰巧改进而不是恶化。
为什么“摇摆”会改变性能?它可能会改变地址对齐,分支预测,编译器查看什么是热点,什么是冷,CPU指令缓存使用情况。
所有这些都是从语义角度来看的实现细节。然而他们影响了表现。它们非常难以预测,因为它们的工作水平很低而且非常复杂。
答案 1 :(得分:1)
如果没有代码示例,很难给出合理的解释,但对于大多数编程语言来说,usr的答案是非常正确的。
但是,对于Flash编译器,我确实有所保留。从经验来看,自我内联(所以与你所做的相反)通常是优化flash中函数的最佳方法之一,因为函数调用开销非常高。
话虽如此,我同意我们的观点,即拥有较少的局部变量很可能是您看到性能提升的原因。 Flash没有块级范围,这意味着在调用函数时,函数中声明的所有变量都会被分配内存。如果您的第二个代码块声明仅在该特定代码块中有用的变量,并且该代码仅在有时运行(如果它在if语句中),则可以解释性能提升。
您可以看到性能提升的案例示例:
public function foo() : void
{
var bar : MyObj;
//do stuff with bar
if(someValuesAreTrue)
{
var jad : oObj;
var jad2 : oObj;
//etc
//do something with jad
}
}
//changed to
public function foo() : void
{
var bar : MyObj;
//do stuff with bar
if(someValuesAreTrue)
{
subFunc();
}
}
private function subFunc() : void
{
var jad : oObj;
var jad2 : oObj;
//etc
//do something with jad
}
如果这不是您所处的情况,我会非常好奇地看到一些代码,因为它可以更好地洞察其他性能提升自我内联的替代方案。