Ruby使用心得汇总:寻找高效的实现
创始人
2024-04-27 17:51:48
0次

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

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

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

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

上面执行结果:

  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

【编辑推荐】

  1. Ruby on Rails入门之道
  2. Ruby on Rails 2.3.3发布 主要修复Bug
  3. Ruby on Rails开发的五点建议
  4. 浅谈Ruby和JRuby的学习
  5. Web开发谁更高效 Java对决Ruby on Rails

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...