Ruby使用心得汇总:寻找高效的实现

最近因为使用Ruby写一个多线程爬虫,所以积累了一点小心得:

51CTO编辑推荐:Ruby入门教程与技巧大全

Ruby使用心得1、多使用Benchmark测试效率,以寻找高效的实现,尤其是对于频繁执行的代码。Ruby执行的效率本身比较慢,所以代码选择很重要。

require 'benchmark' 


 


n = 100000  


Benchmark.bm { |x|  



  x.report("gsub") {   




    for i in 1..n  




      a = "abcd\nef" * 10  




      b = a.gsub(/\n/," ")  




    end   



 }  



 x.report("  tr") {  




   for i in 1..n  




     a = "a\"bcd\nef" * 10  




     b = a.tr("\n"," ")  




   end    



 }  


 

上面执行结果:

      user     system      total        real  



gsub  2.312000   0.109000   2.421000 (  2.438000)  




tr  0.656000   0.000000   0.656000 (  0.672000) 

两者效率相差近四倍。

Ruby使用心得2、关于字符串连接,尽量使用"<<",而不是"+=",因为两者效率相差巨大。

 require 'benchmark' 


   


 Benchmark.bm { |b|  



   b.report("+= ") {  




     a = "" 




     100000.times { a += "foo" }  



   }  



   b.report("<< ") {  




     a = "" 




    100000.times { a << "foo" }  



  }  


}  

执行结果:

      user     system      total        real  



+=  22.390000   9.750000  32.140000 ( 35.671000)  




<<   0.094000   0.000000   0.094000 (  0.094000)  

Ruby使用心得3、注意Ruby的异常类层次:

Exception 


    * fatal  


    * NoMemoryError  


    * ScriptError  


          o LoadError  


          o NotImplementedError  


          o SyntaxError  


    * SignalException  


          o Interrupt  


    * StandardError  


          o ArgumentError  


          o IOError  


                + EOFError  


          o IndexError  


          o LocalJumpError  


          o NameError  


                + NoMethodError  


          o RangeError  


                + FloatDomainError  


          o RegexpError  


          o RuntimeError  


          o SecurityError  


          o SystemCallError  


          o ThreadError  


          o TypeError  


          o ZeroDivisionError  


    * SystemExit  


    * SystemStackError  

使用 rescue 捕捉异常时,如果没有指定捕捉的异常类型,则默认为StandardError。(If you write a rescue clause with no parameter list, the parameter defaults to StandardError.――参见Programming Ruby)

这点需要特别注意,因为我们往往习惯性假设它会捕捉所有异常。譬如Net::HTTP获取页面如果超时会抛出Timeout::Error异常,其为Interrupt的子类,所以不能被无参的 rescue 捕获。我就在这上面栽过跟头。

Ruby使用心得4、这里有一些非常好的参考资料:

Ruby-Doc.org ―― Ruby文档的权威网站

Programming Ruby ―― Ruby权威的文档

Ruby Class and Library Reference ―― 很方便的常见类的参考

Ruby QuickRef ―― 快速索引,查各种符号和用法很方便

Ruby User's Guide ―― Ruby各方面精简介绍,入门不错

PLEAC Ruby ―― Ruby的Cookbook

相关推荐