如何将代码放在单独的函数中可以提高性能?

时间:2012-04-29 16:44:24

标签: performance actionscript-3 flash-builder

我有一个稍微大的功能(大约80行代码没有注释),我正在优化。

作为尝试让探查器为我工作的一部分,我拿了2块代码并将它们放在不同的函数中(这应该是暂时的,直到我可以把它们放回去)。

有趣的是: 我的测试案例耗时29.8秒 在我将第一个块放入一个单独的函数后,我看到由于函数调用开销导致的性能损失很小。 (30.2秒) 当我将第二块代码放入一个单独的函数时,我获得了相当大的性能增益,低至24.2秒

第二块代码是插入一个相当大的链表,我计划用二叉树或其他东西替换,但这20%的改进对我来说相当混乱。

tl; dr:尝试优化代码并注意到将代码块放入单独的函数中会使性能提高20%。这怎么可能?

编辑:确认在发布版本中运行

2 个答案:

答案 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
}

如果这不是您所处的情况,我会非常好奇地看到一些代码,因为它可以更好地洞察其他性能提升自我内联的替代方案。