| 
 
| 赞 | 13 |  
| VIP | 118 |  
| 好人卡 | 28 |  
| 积分 | 13 |  
| 经验 | 35779 |  
| 最后登录 | 2017-7-6 |  
| 在线时间 | 1564 小时 |  
 Lv3.寻梦者 
	梦石0 星屑1305 在线时间1564 小时注册时间2008-7-30帖子4418 
 | 
| 受pia专用ID 发表于 2011-10-2 16:11 ![]() t1 = Time.now
 1000000.times {
 a = Math.sind(32.574915436)
考虑到Math::PI已经是个浮点数了,所以可以不需要显式的转化。所以代码可以优化为下述模式:
 而你的测试使用的是两个意义上不同的值,所以不能作为比较的依据。我采用了Ruby内置的Benchmark模块,给出了一个精度很高的结果。测试的是求取45°角(π/4弧度)的正弦值。复制代码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 1.9.2,OS是Windows XP Professional,测试结果如下:
 得到的结果是,如果不是采用一个弧度的立即值,sind花的时间是sin的两倍(大概是花在方法的跳转上)。不过建议是,如果不是涉及到诸如3D游戏设计,就不要去在意效率了,何必把自己弄得如此苦逼呢?复制代码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
 | 
 |