Flash与Air点滴之 - 数组的join效率问题

昨天在论坛看到一篇帖子,讲AS性能优化的,优化思路就是AS中的Aarray的join方法性能差,采用通过Extenernall来调用Javascript的join方法来达到优化目的。

初看这个思路,和大多数人一样,我一直认为AS在各方面都是优于JS的,即使像V8这样的引擎下,我仍觉得,作为一门解释型语言,性能怎么可能超出编译型语言呢?

然而,事实就是事实,我不知道AS中这个join方法是什么问题导致的,但它实际确实比js中的join相差10倍左右,即使在ie下(我的ie9),也相差8倍左右。实际测试数据我就不帖了,大家可以去查看原帖,这个原帖也是转自国外的一篇文章。

用JavaScript优化AS3

虽然这种优化思路很多人觉得得不偿失,或者实用性太差。我的想法也是,一个是浪费了时间做外部接口(虽然只是很小的工作量),另外也提高了Flash的环境依赖性,最后,用到实际项目中,必须是要传回字符串而不是长度,这种情况下效率节省也只是一点点而已。

但是,不得不说,这种测试有它的可取之处,Adobe有必要提升下AS3的性能了,虽然相比AS2已经有了质的飞跃,但作为一门编译型语言,性能还不如解释型语言(只是在个别地方),有点说不过去。

使用发帖人提供的测试代码测试之后,我也对代码作过一些修改测试。

一、AS3有一个Vector对象,据说是比Array效率高很多,原因就是它限定了元素类型,还可以锁定长度。但是对AS3中使用它的join方法,仍然没有改善。

二、改善重复动作,将每次循环里的测试用数组的join操作提到外部提前预备好一个字符串(当然,这个做法就与测试目的有些违背了,但实际项目中若有这种需求,这种方法是必须的。),这个改进效果非常大。性能相比原来提升十几倍之多。这就说明,AS3的主要性能消耗就在join方法上。

三、改善方式,在循环中不调用方法,改调用数组的contact,生成一个临时数组,组装所有长度,再一次性调用join。这个性能改改善也是非常大,基本上与上面的耗时持来。这就说明AS3的优势在于concat,包括字符串的concat方法,都会带来性能的提升。

补充一点,concat性能虽然高,用它来重写数组的join方法还是比原生的差很多,这是必须的。

最后,这种测试并不一定要让我们用到实际项目中,更多的是教我们反思,教我们了解某个工具的优势和弱势,这样在遇到实际问题的时候才能提供更好的解决办法,游刃有余!

ActionScript是我最喜欢的一门语言之一,它几乎弥补了Jvascript带给我们的缺憾(个人感觉),而且,现在Adobe也在努力将Flash提升为一种跨平台的解决方案,虽然目前尚有很多不成熟的地方,但是,值得期待。期待Flas/ActionScript的再一次提升。