ルビーのちょっと気をつけて
3737 ワード
ルビーのちょっと気をつけて
最近はルビーを使ってマルチスレッド爬虫類を書いているので、少し気をつけました.
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
=
"
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を使用して例外をスナップする場合、スナップの例外タイプが指定されていない場合は、デフォルトは
この点は、常に習慣的にすべての例外をキャプチャすると仮定しているため、特に注意する必要があります.例えば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
最近はルビーを使ってマルチスレッド爬虫類を書いているので、少し気をつけました.
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
=
"
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