赞 | 13 |
VIP | 118 |
好人卡 | 28 |
积分 | 12 |
经验 | 35779 |
最后登录 | 2017-7-6 |
在线时间 | 1564 小时 |
Lv3.寻梦者
- 梦石
- 0
- 星屑
- 1190
- 在线时间
- 1564 小时
- 注册时间
- 2008-7-30
- 帖子
- 4418
|
受pia专用ID 发表于 2011-10-2 16:11
t1 = Time.now
1000000.times {
a = Math.sind(32.574915436)
考虑到Math::PI已经是个浮点数了,所以可以不需要显式的转化。所以代码可以优化为下述模式:- module Math
- def self.d2a(degree)
- return degree * PI / 180
- end
- def self.a2d(arc)
- return arc * 180 / PI
- end
- def self.sind(d)
- return sin(d2a(d))
- end
- def self.cosd(d)
- return cos(d2a(d))
- end
- # 其他三角函数诸此
-
- # 不借助与其他方法的One-line版
- def self.ssind(d)
- return sin(d * PI / 180)
- end
- end
复制代码 而你的测试使用的是两个意义上不同的值,所以不能作为比较的依据。我采用了Ruby内置的Benchmark模块,给出了一个精度很高的结果。测试的是求取45°角(π/4弧度)的正弦值。
环境是Ruby 1.9.2,OS是Windows XP Professional,测试结果如下:- Rehearsal -----------------------------------------------------------
- sin(0.7853981633974483) 0.125000 0.000000 0.125000 ( 0.125000)
- sin(Math::PI / 4) 0.187000 0.000000 0.187000 ( 0.187500)
- sind(45) 0.281000 0.000000 0.281000 ( 0.281250)
- ssind(45) 0.266000 0.000000 0.266000 ( 0.265625)
- -------------------------------------------------- total: 0.859000sec
- user system total real
- sin(0.7853981633974483) 0.125000 0.000000 0.125000 ( 0.125000)
- sin(Math::PI / 4) 0.187000 0.000000 0.187000 ( 0.187500)
- sind(45) 0.281000 0.000000 0.281000 ( 0.281250)
- ssind(45) 0.266000 0.000000 0.266000 ( 0.265625)
- #--- 检测三个方法的输出是否一致
- 0.7071067811865475
- 0.7071067811865475
- 0.7071067811865475
- 0.7071067811865475
复制代码 得到的结果是,如果不是采用一个弧度的立即值,sind花的时间是sin的两倍(大概是花在方法的跳转上)。不过建议是,如果不是涉及到诸如3D游戏设计,就不要去在意效率了,何必把自己弄得如此苦逼呢? |
|