と にまったく違いは%r/foo/
ありません/foo/
。
irb(メイン):001:0> %r[foo]
=> /foo/
irb(メイン):002:0> %r{foo}
=> /foo/
irb(メイン):003:0> /foo/
=> /foo/
ソース スクリプトは、起動時にインタープリターによって分析され、実行時に同じになる正規表現に変換されます。
唯一の違いはソース コードであり、実行可能ファイルではありません。これを試して:
require 'benchmark'
str = (('a'..'z').to_a * 256).join + 'foo'
n = 1_000_000
puts RUBY_VERSION, n
puts
Benchmark.bm do |b|
b.report('%r') { n.times { str[%r/foo/] } }
b.report('/') { n.times { str[/foo/] } }
end
どの出力:
1.9.3
1000000
user system total real
%r 8.000000 0.000000 8.000000 ( 8.014767)
/ 8.000000 0.000000 8.000000 ( 8.010062)
これは、10.8.2 を実行している古い MacBook Pro にあります。考えてみてください。6,656,000,000 (26 * 256 * 1,000,000) 文字が検索され、どちらも本質的に同じ値を返しました。一致?ないと思います。
これをマシンで実行し、その CPU での 2 つのテスト間で大幅に異なる回答を得ることは、同じものを指定する 2 つの構文的に異なる方法の実行時のパフォーマンスの違いを示します。私はそれが起こることを真剣に疑っています。
編集:
複数回実行すると、ランダム性が動作していることがわかります。今朝、コードを少し調整して、ベンチマーク全体で 5 つのループを実行できるようにしました。システムはテストの実行中にディスクをスキャンしていたので、少し時間がかかりましたが、2 回の実行の間にランダムな小さな違いが見られます。
require 'benchmark'
str = (('a'..'z').to_a * 256).join + 'foo'
n = 1_000_000
puts RUBY_VERSION, n
puts
regex = 'foo'
Benchmark.bm(2) do |b|
5.times do
b.report('%r') { n.times { str[%r/#{ regex }/] } }
b.report('/') { n.times { str[/#{ regex }/] } }
end
end
そして結果:
# user system total real
%r 12.440000 0.030000 12.470000 ( 12.475312)
/ 12.420000 0.030000 12.450000 ( 12.455737)
%r 12.400000 0.020000 12.420000 ( 12.431750)
/ 12.400000 0.020000 12.420000 ( 12.417107)
%r 12.430000 0.030000 12.460000 ( 12.467275)
/ 12.390000 0.020000 12.410000 ( 12.418452)
%r 12.400000 0.030000 12.430000 ( 12.432781)
/ 12.390000 0.020000 12.410000 ( 12.412609)
%r 12.410000 0.020000 12.430000 ( 12.427783)
/ 12.420000 0.020000 12.440000 ( 12.449336)
約 2 秒後に実行:
# user system total real
%r 12.360000 0.020000 12.380000 ( 12.390146)
/ 12.370000 0.030000 12.400000 ( 12.391151)
%r 12.370000 0.020000 12.390000 ( 12.397819)
/ 12.380000 0.020000 12.400000 ( 12.399413)
%r 12.410000 0.020000 12.430000 ( 12.440236)
/ 12.420000 0.030000 12.450000 ( 12.438158)
%r 12.560000 0.040000 12.600000 ( 12.969364)
/ 12.640000 0.050000 12.690000 ( 12.810051)
%r 13.160000 0.120000 13.280000 ( 14.624694) # <-- opened new browser window
/ 12.650000 0.040000 12.690000 ( 13.040637)
速度に一貫した違いはありません。