AS3构造缓慢?

我听说代码放在构造里要比放在构造之外的执行速度慢些。所以,我决定做一个测试,看看构造有多慢?
  这项测试的方法是:在构造函数和非构造函数中运行一些代价较高的代码。并没有考虑此代码完全相同,只是确保代码直接地在构造函数中工作,而不是间接地通过函数调用。通常你应该考虑到这点,但在这里它会破坏测试的目的。
  我选择做一个大量循环累计的工作。计算的结果是没有意义的,但是用公有变量存储该值是为了确保编辑器将不会优化内循环,尽管它可能无论如何也不会做优化。
  事不宜迟,下面是测试用的代码:
  1. package
  2. {
  3.     import flash.text.*;
  4.     import flash.events.*;
  5.     import flash.display.*;
  6.     public class ConstructorTest extends Sprite
  7.     {
  8.         private var __logger:TextField = new TextField();
  9.         public function ConstructorTest()
  10.         {
  11.             __logger.autoSize = TextFieldAutoSize.LEFT;
  12.             addChild(__logger);
  13.             // Do the next frame so we don't test code in functions called FROM
  14.             // a constructor, just in case.
  15.             addEventListener(Event.ENTER_FRAME, onEnterFrame);
  16.         }
  17.         private function onEnterFrame(ev:Event): void
  18.         {
  19.             // We just wanted to do the test once
  20.             removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  21.             // Constructor test
  22.             var tester:Tester = new Tester(log);
  23.             // Non-constructor test
  24.             tester.init(log);
  25.         }
  26.         private function log(msg:*): void
  27.         {
  28.             __logger.appendText(msg + "/n");
  29.         }
  30.     }
  31. }
  32. import flash.utils.*;
  33. class Tester
  34. {
  35.     public var total:int;
  36.     public function Tester(log:Function)
  37.     {
  38.         var total:int = 0;
  39.         var beforeTime:int = getTimer();
  40.         for (var i:int; i < 50000; ++i)
  41.         {
  42.               for (var j:int = 0; j < i; ++j)
  43.             {
  44.                 total += j;
  45.             }
  46.         }
  47.         log("constructor time: " + (getTimer()-beforeTime));
  48.         this.total = total;
  49.     }
  50.     public function init(log:Function): void
  51.     {
  52.         var total:int = 0;
  53.         var beforeTime:int = getTimer();
  54.         for (var i:int; i < 50000; ++i)
  55.         {
  56.             for (var j:int = 0; j < i; ++j)
  57.             {
  58.                 total += j;
  59.             }
  60.         }
  61.         log("init() time: " + (getTimer()-beforeTime));
  62.         this.total = total;
  63.     }
  64. }
复制代码

Intel Core 2 Duo 2.2Ghz二级缓存2GB,Mac OS X 10.6 (Snow Leopard)获得的输出结果:
   构造时间:3446;
    init()时间:3437

Intel Core 2 Duo 3.0Ghzz二级缓存2GB,Windows上获得的结果:
   构造时间:2518;
    init()时间:2519

从整体规模上看这些结果看上去很相近。虽然init()函数有时会比构造要快一丁点,但的确是微乎其微。除非你把重要工作几乎全在构造中完成。否则我不认为你有什么可担心的。

 

个人的看法好像在一篇文章上看到说是JIT未对构造函数进行优化造成这个现象,可是为什么不优化呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值