我有一个稍微大的函数(大约80行代码,没有注释),我正在优化。
作为让分析器为我完成工作的一部分,我取下了2段代码,并将它们放在单独的函数中(这应该是临时的,直到我可以将它们放回)。
有趣的是:我的测试用例花费了29.8秒
在将第一个块放入单独的函数后,我看到了函数调用开销造成的小性能损失。(30.2秒)当我将第二个代码块放入一个单独的函数中时,我获得了相当大的性能增益,降至24.2秒
第二个代码块是插入到一个相当大的链接列表中,我计划用二叉树或什么来替换它,但是这20%的改进仍然让我非常困惑。
博士:试图优化代码,并注意到将代码块放入单独的函数中可以提高20%的性能。怎么可能?
编辑:在版本构建中也已确认运行
发布于 2012-04-29 16:56:30
通过提取这段代码,函数变得更简单了。也许这有助于编译器高效地编译函数。它可能减轻了寄存器压力,因为局部变量较少。
有时候,这只是巧合。随机切换代码很可能会改变性能(在这两种情况下)。可能只是碰巧出现了改进而不是恶化。
为什么“抖动”改变性能?它可能会改变地址对齐,分支预测,编译器查看什么是热的,什么是冷的,CPU指令缓存的使用。
从语义的角度来看,所有这些都是实现细节。然而,它们会影响业绩。他们是相当不可预测的,因为他们的工作水平很低,而且非常复杂。
发布于 2012-04-30 10:28:12
没有代码示例,很难给出一个适当的解释,但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
}如果这不是您所处的情况,我会非常好奇地看到一些代码,因为它可以更好地洞察其他性能提升的替代方案。
https://stackoverflow.com/questions/10373908
复制相似问题