ルビーのちょっと気をつけて

3737 ワード

ルビーのちょっと気をつけて
最近はルビーを使ってマルチスレッド爬虫類を書いているので、少し気をつけました.
1、Benchmarkを多く使用して効率をテストし、特に頻繁に実行されるコードに対して効率的な実現を探す.Rubyは実行効率自体が遅いので,コード選択が重要である.
 1 
require 
'
benchmark
'
 2 
 3 

=
 
100000
 4 
Benchmark.bm { 
|
x
|
 5 
  x.report(
"
gsub
"
) { 
 6 
    
for
 i 
in
 
1
..n
 7 
      a 
=
 
"
abcdef
"
 
*
 
10
 8 
      b 
=
 a.gsub(
/
/
,
"
 
"
)
 9 
    end 
10 
  }
11 
  x.report(
"
  tr
"
) {
12 
    
for
 i 
in
 
1
..n
13 
      a 
=
 
"
a\
"
bcdef
"
 * 10
14 
      b 
=
 a.tr(
"
"
,
"
 
"
)
15 
    end  
16 
  }
17 
}
上の実行結果:
      user     system      total        realgsub  2.312000   0.109000   2.421000 (  2.438000)  tr  0.656000   0.000000   0.656000 (  0.672000)
両者の効率は4倍近く異なる.
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 
}
実行結果:
      user     system      total        real
+=
  
22.390000
   
9.750000
  
32.140000
 ( 
35.671000
)
<<
   
0.094000
   
0.000000
   
0.094000
 (  
0.094000
)
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に捕獲されません.私はこの上で失敗しました.
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