Math函数性能比较
来源:互联网 发布:红孩儿大话火焰山 知乎 编辑:程序博客网 时间:2024/06/02 19:43
无论刚入门的还是有一定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);// 结果:1865var 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);// 结果:95var 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);// 结果:1931var 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。
- Math函数性能比较
- Math函数性能比较
- js函数Math random()、ceil()、floor()、round() 比较
- Python3之绘制幂函数,画心型,math,numpy比较
- Math 函数
- Math函数
- 函数Math
- math函数
- Math函数
- Math函数
- sql2005 like 和 charindex 函数性能比较
- 字符串拷贝函数的性能比较
- 统计对象大小函数性能比较
- linux、windows 时间函数性能比较
- 常用sql函数及高效性能比较
- Delphi Math里的基本函数,以及浮点数比较函数
- Delphi Math里的基本函数,以及浮点数比较函数
- math.random()、math.floor()、math.round()、math.ceil()函数总结
- 组合问题
- 更改fstab文件出现 错误
- POI学习记录
- 年月日三下拉框联动
- C++关键字static的用法
- Math函数性能比较
- git log
- 一个仿照Nginx的内存池
- sdfsdfasd
- Hibernate Class Is Not Mapped ?
- 想你,但不爱你
- Android crash 日志捕获
- JavaScript可否多线程? 深入理解JavaScript定时机制
- vc6.0中重绘Listctl的网格线