AS3的一些优化计算方法

本文介绍了几种提高计算效率的方法,包括使用乘法替代除法、位运算替代乘除操作、使用unit()或int()替代Math.floor()和Math.ceil()、以及使用乘-1替代Math.abs()方法等。通过对比测试,展示了不同方法之间的性能差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载地址:http://www.cnblogs.com/sevenyuan/archive/2009/11/20/1607084.html

1、用乘法来代替除法(当除数可转化为有限数的时候)。比如var n:Number = value *0.5;要比var n:Number = value / 2;快。但差别并不是很大。只有在需要大量计算情况下,比如3D引擎中差别才比较明显。

2、用位运算代替除2或乘2。比如10>>1要比10*2快,而10<<1要比10*2快。从测试来看位运算几乎比乘除快一倍,但是一般情况下,我们不能选择位运算,比如我们就不能用13>>1来代替13/2,尽管前者比后者运算速度更快,但2者的运算结果却不一样。所以还是要看具体情况。

3、用unit()或int()代替取整运算Math.floor()和Math.ceil()。比如var test:uint = uint(1.5);要比var test:Number = Math.floor(1.5);快;而var test:uint = uint(1.5)+1;要比var test:Number = Math.ceil(1.5);也快。如果是Math.floor(),还可以用位运算(>>0)来代替。比如var test:uint =1.5>>0,比unit()或int()更快。

4、用乘-1来代替Math.abs()方法。比如var nn:Number = -23;var test:Number= nn < 0 ? nn * -1 : nn;要比var nn:Number = -23;var test:Number = Math.abs(nn);快。

当然还有更多的优化计算的方法。一般来说,低级运算要比高级运算速度;内部方法比调用其他方法速度快。另外要注意的是,这些方法有的时候可能并一定适用。

附上测试代码:

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->   1  import  flash.utils.getTimer;
  2 
  3  var time:Number  =  getTimer();
  4 
  5  function runDivisionTest(): void
  6  {
  7      time  =  getTimer();
  8       for  (var i:Number  =   0 ; i  <   10000000 ; i ++ )
  9      {
 10          var test:Number  =  i  /   2 ;
 11      }
 12 
 13      trace( " DivisionTest:  " , (getTimer()  -  time));
 14  }
 15 
 16  function runMultTest(): void
 17  {
 18      time  =  getTimer();
 19       for  (var i:Number  =   0 ; i  <   10000000 ; i ++ )
 20      {
 21          var test:Number  =  i  *  . 5 ;
 22      }
 23      trace( " MultTest:  " , (getTimer()  -  time));
 24  }
 25 
 26  function runBitTest(): void
 27  {
 28      time  =  getTimer();
 29       for  (var i: int   =   0 ; i  <   10000000 ; i ++ )
 30      {
 31          var test: int   =  i  >>   1 ;
 32      }
 33      trace( " BitTest:  " , (getTimer()  -  time));
 34  }
 35 
 36  function runFloorTest(): void
 37  {
 38      time  =  getTimer();
 39       for  (var i:uint  =   0 ; i  <   10000000 ; i ++ )
 40      {
 41          var n:Number  =   1.5 ;
 42          var test:Number  =  Math.floor(n);
 43      }
 44      trace( " FloorTest:  " , (getTimer()  -  time));
 45  }
 46 
 47  function runUintTest(): void
 48  {
 49      time  =  getTimer();
 50       for  (var i:uint  =   0 ; i  <   10000000 ; i ++ )
 51      {
 52          var n:Number  =   1.5 ;
 53          var test:uint  =  uint(n);
 54      }
 55      trace( " UintTest:  " , (getTimer()  -  time));
 56  }
 57 
 58  function runCeilTest(): void
 59  {
 60      time  =  getTimer();
 61       for  (var i:uint  =   0 ; i  <   10000000 ; i ++ )
 62      {
 63          var n:Number  =   1.5 ;
 64          var test:Number  =  Math.ceil(n);
 65      }
 66      trace( " CeilTest:  " , (getTimer()  -  time));
 67  }
 68 
 69  function runUintCeilTest(): void
 70  {
 71      time  =  getTimer();
 72       for  (var i:uint  =   0 ; i  <   10000000 ; i ++ )
 73      {
 74          var n:Number  =   1.5 ;
 75          var test:uint  =  n  ==  uint(n)  ?  n : uint(n)  +   1 ;
 76      }
 77      trace( " UintCeilTest:  " , (getTimer()  -  time));
 78  }
 79 
 80  function runABSTest(): void
 81  {
 82      time  =  getTimer();
 83       for  (var i:uint  =   0 ; i  <   10000000 ; i ++ )
 84      {
 85          var n:Number  =   - 1.5 ;
 86          var test:Number  =  Math.abs(n);
 87      }
 88      trace( " ABSTest:  " , (getTimer()  -  time));
 89  }
 90 
 91  function runABSMultTest(): void
 92  {
 93      time  =  getTimer();
 94       for  (var i:uint  =   0 ; i  <   10000000 ; i ++ )
 95      {
 96          var n:Number  =   - 1.5 ;
 97          var test:Number  =  n  <   0   ?  n  *   - 1  : n;
 98      }
 99      trace( " ABSMultTest:  " , (getTimer()  -  time));
100 
101  }
102 
103  runDivisionTest();
104 
105  runMultTest();
106 
107  runBitTest();
108 
109  runFloorTest();
110 
111  runUintTest();
112 
113  runCeilTest();
114 
115  runUintCeilTest();
116 
117  runABSTest();
118 
119  runABSMultTest();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值