`

Math函数性能比较

 
阅读更多

无论刚入门的还是有一定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。

<script src="/ggao/news_js/MyClass_it.js"></script><script type="text/javascript"></script><script src="http://cpro.baidu.com/cpro/ui/f.js" type="text/javascript"></script><script src="http://pos.baidu.com/ecom?di=u249277&amp;tm=BAIDU_CPRO_SETJSONADSLOT&amp;fn=BAIDU_CPRO_SETJSONADSLOT&amp;baidu_id=" type="text/javascript"></script>

分享到:
评论

相关推荐

    Scratch 作品:Alpha Math 函数计算器

    全站性能最强的函数计算器; 有着恐怖高精度(一个屏幕描15360个点)和惊人的算力; 支持方程不等式、精度设置、极坐标等高级设置。 此后仍有作品或有趣游戏、爆笑作品,请关注原作者,且点赞加收藏,记得推荐好友...

    PHP内置的Math函数效率测试

    主要介绍了PHP内置的Math函数效率测试,以实例形式测试了相关的PHP内置数学运算函数的执行时间,分析其运行效率,需要的朋友可以参考下

    Math.NET Numerics nupkg包可以与MATLAB相互补充

    数值计算:Math.NET Numerics提供了大量的数值计算函数和算法,包括基本的数学运算、矩阵和向量操作、求解线性方程组、特征值和特征向量计算、快速傅里叶变换等。 统计学:该库支持各种统计学函数和方法,包括描述...

    verilog-math:Verilog中的数学函数

    全流水线,高性能 算术:除法器,乘法器,加法器,减法器和平方根 转换:float_to_int和int_to_float 舍入功能:底数,小数位数,截断和最近 支持非正规数 舍入到最近(均等) 每个功能的双精度和单精度版本 IP核...

    Python三角函数基础和提高优化笔记.md

    本文首先介绍了Python中表示和计算三角函数的基础知识,以math模块为例 illustrate 了代码实现方法。在此基础上,讨论了三角函数计算的优化策略,如利用数学库的性能优势、使用泰勒级数近似等方法,分析了优化策略的原理...

    Scratch 3D 图形化计算:Alpha Math 13 计算器套件.sb3

    2. 高性能,自 Alpha Math 诞生以来,我们不断追求性能提升,突破 Scratch 的极限; 3. 兼容性好,支持从旧版 Alpha Math 和几何计算器,可导入 / 导出存档; 此后仍有作品或有趣游戏,可以进行学习与借鉴。请关注...

    SIMD-math-prims:一些数学函数的矢量化实现

    在最近的处理器上使用gcc矢量化进行编译时,simd_math_prims.h中的函数可将速度从20倍提高到40倍。 Clang也做得很好,而且不太新的处理器也提供了很大的提速。 为了利用此优势,您可以使用gcc或clang的“ -O3 -...

    云计算仿真工具cloudsim 3.0.3 【无错误,带例子!】

    看看压缩包大小你就知道怎么样!完美运行后从eclipse导出来的项目...它的首要目标是在云基础设施(软件、硬件、服务)上,对不同应用和服务模型的调度和分配策略的性能进行量化和比较,达到控制使用云计算资源的目的。

    J2ME 高精度 反正切函数等 atan(double angle) Pol(double x, double y) Rec(double r, double θ)

    写J2ME程序时,如果想使用反正切函数是必须自己写算法的.因为J2ME的Math类里没有的反正功函数.修改里面的n值可更改精度和性能.

    比Math类库abs()方法性能更高的取绝对值方法介绍

    Math.abs()的实现源码 通过三目运算符判断a是否小于0来实现 /** * Returns the absolute value of an {@code int} value. * If the argument is not negative, the argument is returned. * If the argument is ...

    JDK_API1.6中文版

    public final class Mathextends ObjectMath 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。 与 StrictMath 类的某些数学方法不同,并非 Math 类所有等价函数的实现都定义为返回逐位...

    sheep.js:JavaScript性能测试库

    用参数测试一个函数: sheep . test ( { name : "How fast is Math.round()?" , test : function ( ) { Math . round ( 27.443 ) ; } } ) ; 测试对象上的方法: sheep . test ( { name : "How fast Array....

    javascript中的关于类型转换的性能优化

    1. 把数字转换成字符串,应用”” + 1,虽然看起来比较丑一点,但事实上这个效率是最高的,性能上来说:(“” + ) &gt; String() &gt; .toString() &gt; new String(),尽量使用编译时就能使用的内部操作要比运行时使用的用户...

    matlab车牌代码-Mathematiques:Mathématiques:优雅,快速且扩展的C++数值库

    ++中执行线性代数,微积分,矢量微积分等,同时还提供了手工编写的C或Fortran的运行时性能和内存使用情况。 Mathématiques的优雅和多功能性使其与其他库区分开来,只有使用C ++ 11、14和17的功能才能实现。 V3.0...

    使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧

    我们先从 Math.max() 函数说起, Math.max后面可以接任意个参数,最后返回所有参数中的最大值。 比如 alert&#40;Math.max(5,8&#41;) //8 alert&#40;Math.max(5,7,9,3,1,6&#41;) //9 但是在很多情况下,我们需要...

    FCore:高性能F#数值和机器学习库

    FCore是一个.NET库,但是为了在Intel上获得最佳性能,它可以通过Intel Math Kernel Library进行加速。 而且,它使用本机C函数分配内存,以便绕过.NET内存限制并最大程度地减少垃圾回收。 MIT / X11许可的条款涵盖...

    math-neon.rar_单片机开发_Asm_

    使用arm的neon实现的数学函数库,其性能比较高。

    小议Function.apply()之二——利用Apply的参数数组化来提高 JavaScript程序性能

    我们先从 Math.max() 函数说起, Math.max后面可以接任意个参数,最后返回所有参数中的最大值。 比如 alert&#40;Math.max(5,8&#41;) //8alert&#40;Math.max(5,7,9,3,1,6&#41;) //9 但是在很多情况下,我们需要找...

    Go |单元测试的方法

    Go的单元测试函数分为功能测试函数和性能测试函数。这里先说功能性测试函数。 测试函数的声明要以TestXXX的形式开头,并且形参为 (t *testing.T)。比如两个文件和其对应的测试文件。在测试函数中,可以使用t.Errorf...

    JavaScript经典实例

     6.8使用一个通用的科里化函数提高应用程序性能  6.9使用缓存计算(Memoization)来提高应用程序性能  6.10使用匿名函数包装全局变量  第7章处理事件  7.0简介  7.1检测页面何时完成载入  7.2使用Event对象...

Global site tag (gtag.js) - Google Analytics