AS3编程基础:Math函数性能比较
作者 佚名技术
来源 服务器技术
浏览
发布时间 2012-07-07
无论刚入门的还是有一定AS3编程基础的,对Math类应该都不陌生了,但Math类的性能又知多少呢?请看下文吧。 1、Math.floor() 通俗的讲这是一个取整函数。 其实官方解释是 返回由参数 val 指定的数字或表达式的下限值。 下限值是小于等于指定数字或表达式的最接近的整数。 性能测试: var num:Number = Math.PI; var length:int = 10000000; var time:int = getTimer(); for(var i:int = 0; i < length; i ++){ Math.floor(num); } trace(getTimer() - time); // 结果:1865 var num:Number = Math.PI; var length:int = 10000000; var time:int = getTimer(); for(var i:int = 0; i < length; i ++){ int(num); } trace(getTimer() - time); // 结果:69 结果很明显,int比floor快,可能大家就要说了,那Adobe傻X写个这样接口干什么?其实这就是我想说的对于floor的使用误区。 仔细看官方解释,其实floor不是一个真正我们所理解的取整函数,他是去找最接近自己,且比自己小或者等于的整数,那这是什么意思呢? var num:Number = - Math.PI; trace(int(num)); trace(Math.floor(num)); // 结果1:-3 // 结果2:-4 这个例子很明确表示,当目标数字是负数时,int和floor所得出的结果不一样。 int()的官方解释 将给定数字值转换成整数值。 从小数点处截断十进制值。 相信看到这,你已经很明白了。 但是实际上,如果你这样去使用int(),跟floor输出的结果相同: var num:Number = - Math.PI; var length:int = 10000000; var time:int = getTimer(); for(var i:int = 0; i < length; i ++){ if(num < 0){ int(num) - 1; }else{ int(num); } } trace(getTimer() - time); // 结果:132 2、Math.pow() 对于这个方法,我也不知道说什么好了,先看性能测试吧: var a:int = 3; var b:int = 4; var c:int = 5; var length:int = 10000000; var time:int = getTimer(); for(var i:int = 0; i < length; i ++){ c * c == a * a + b * b; } trace(getTimer() - time); // 结果:95 var a:int = 3; var b:int = 4; var c:int = 5; var length:int = 10000000; var time:int = getTimer(); for(var i:int = 0; i < length; i ++){ Math.pow(c,2) == Math.pow(a,2) + Math.pow(b,2); } trace(getTimer() - time); // 结果:7999 勾三股四弦五大家应该比较多,但是用"*"乘法运算和pow的性能比较那是非常明显啊。 难道大家又想说Adobe傻逼了?这儿我为它平反吧。 var num:Number = Math.PI; var length:int = 10000000; var time:int = getTimer(); for(var i:int = 0; i < length; i ++){ Math.pow(num,10000); } trace(getTimer() - time); // 结果:6682 先不说"*"乘法运算比pow快,就上面这段你能把它换算成使用"*"乘法运算吗? 而且pow其实是可以这样用的:(数学学得好都知道开方其实是可以转换成乘方来算的) trace(Math.pow(27,1/3)); trace(Math.pow(256,1/4)); trace(Math.pow(3125,1/5)); 而开方函数Adobe只提供了sqrt一个开平方根的接口(经测试Math.sqrt(9)比Math.pow(9,1/2)快,但开立方等就得靠pow了)。 3、Math.round() 这个方法跟floor一样的,先看性能测试: var num:int = Math.PI; var length:int = 10000000; var time:int = getTimer(); for(var i:int = 0; i < length; i ++){ Math.round(num); } trace(getTimer() - time); // 结果:1931 var num:int = Math.PI; var length:int = 10000000; var time:int = getTimer(); for(var i:int = 0; i < length; i ++){ int(num + 0.5) } trace(getTimer() - time); // 结果:68 四舍五入其实加个0.5在取整,这样也是可以的,只不过用这个算法,存在跟第一个同样的问题,当目标数值为负时,两种方式结果不一样,需要加个判断,目标数值为负就把结果-1。 关键词: |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于AS3编程基础:Math函数性能比较的所有评论