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

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

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

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

 
 
 
  1. require 'benchmark'
  2. n = 100000
  3. Benchmark.bm { |x|
  4.   x.report("gsub") { 
  5.     for i in 1..n
  6.       a = "abcd\nef" * 10
  7.       b = a.gsub(/\n/," ")
  8.     end 
  9.  }
  10.  x.report("  tr") {
  11.    for i in 1..n
  12.      a = "a\"bcd\nef" * 10
  13.      b = a.tr("\n"," ")
  14.    end  
  15.  }

上面执行结果:

 
 
 
  1.       user     system      total        real
  2. gsub  2.312000   0.109000   2.421000 (  2.438000)
  3. tr  0.656000   0.000000   0.656000 (  0.672000)

两者效率相差近四倍。

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

 
 
 
  1.  require 'benchmark'
  2.  
  3.  Benchmark.bm { |b|
  4.    b.report("+= ") {
  5.      a = ""
  6.      100000.times { a += "foo" }
  7.    }
  8.    b.report("<< ") {
  9.      a = ""
  10.     100000.times { a << "foo" }
  11.   }
  12. }

执行结果:

 
 
 
  1.       user     system      total        real
  2. +=  22.390000   9.750000  32.140000 ( 35.671000)
  3. <<   0.094000   0.000000   0.094000 (  0.094000)

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

 
 
 
  1. Exception
  2.     * fatal
  3.     * NoMemoryError
  4.     * ScriptError
  5.           o LoadError
  6.           o NotImplementedError
  7.           o SyntaxError
  8.     * SignalException
  9.           o Interrupt
  10.     * StandardError
  11.           o ArgumentError
  12.           o IOError
  13.                 + EOFError
  14.           o IndexError
  15.           o LocalJumpError
  16.           o NameError
  17.                 + NoMethodError
  18.           o RangeError
  19.                 + FloatDomainError
  20.           o RegexpError
  21.           o RuntimeError
  22.           o SecurityError
  23.           o SystemCallError
  24.           o ThreadError
  25.           o TypeError
  26.           o ZeroDivisionError
  27.     * SystemExit
  28.     * 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

Ruby Example Code —— 简单直观的样例代码,Ruby的HelloWorld

Ruby Essentials

新闻名称:Ruby使用心得汇总:寻找高效的实现
文章网址:http://www.mswzjz.cn/qtweb/news9/469009.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能