构建字节码是否比常规动作更有优势?

时间:2012-04-24 07:01:22

标签: actionscript-3 flash bytecode

我非常好奇,使用字节码构建SWF是否比使用常规动作更有优势?

正如我所读,有一些方法可以加快代码的速度,但有些东西是as3code不能做的吗?

编辑: 请不要专注于编码风格,问题,类型检查和语法,假设有外部SWF,其中1个类用字节码编写,现在我想知道从低级编码中可以获得什么好处。

2 个答案:

答案 0 :(得分:2)

Flash编译器不使用Flash播放器中提供的所有操作码,因此理论上,通过“手动”编写操作码确实可以提高性能。

例如,与Flash相比,Haxe编译器可以使用Alchemy OpCodes并提升性能:

  

访问Alchemy OpCodes

     

在Adobe Alchemy中使用的SWF播放器中隐藏了用于内存分配的OpCodes。 Haxe能够访问它们,为您提供低级别的内存访问,从而可以实现巨大的速度提升。

http://haxe.org/doc/why

我不知道使用这些操作码是多么安全。由于官方Flash编译器不支持它们,因此可能会在将来的Flash Player版本中删除它们。

答案 1 :(得分:2)

只是添加了Laurent发布的内容。 ASC是迄今为止Adobe产品使用的ActionScript编译器(MXML使用ASC中的代码,Flash CS中的编译器具有自定义的构建版本,但是既不会对实际编译器产生很大影响,又会充当前端/“粘合剂”链接器和其他实用程序)。

ASC不是优化编译器。这意味着它在编译为较低级语言时通常不会进行任何优化。它只将生成的字节码分析到使主要确定它没有错误的级别。 (编译器仍有可能从有效的AS3代码生成错误的代码。)

您可以在字节码和AS3中编写的所有有效代码之间没有一对一的对应关系。这意味着AS3将您限制为字节码中可能的子集。绝对有可能在结果字节码中你会看到如何更容易获得某个值,当它在堆栈上时,但AS3中没有工具可以从那里获取它。例如,你可以避免创建一个循环迭代器,依赖于第一个寄存器包含迭代器,如果你知道循环中的其余代码永远不会读/写第一个寄存器。显然,当您分析处理字节码的方式时,您可以发现更多“功能”。

但是,重要的是要明白,除非你的目标细致且非常具体,否则在本地优化你几乎不会取得任何重大成就。例如,某些特定的加密算法或字符串解析例程等。手动优化大部分程序确实困难。事实上,如此困难,您需要一个工具来至少验证自己实际上是在优化。最后,您将发现自己使用此工具生成优化的代码变体并对其进行测试 - 这就是编译器的构建方式:)