Я только что прочитал о Regexp.match?('string')
для Ruby 2.4 и был очень рад видеть результаты!Но когда я попробовал это в своем приложении, я едва увидел какой-либо выгоды.
str = 's'
Benchmark.bm do |b|
b.report(".match ") { 100000.times { 'string'.match /s/ } }
b.report(".match? ") { 100000.times { 'string'.match? /s/ } }
b.report(".match dynamic ") { 100000.times { 'string'.match /#{str}/ } }
b.report(".match? dynamic") { 100000.times { 'string'.match? /#{str}/ } }
end
user system total real
.match 0.140000 0.000000 0.140000 ( 0.143658)
.match? 0.020000 0.000000 0.020000 ( 0.029628)
.match dynamic 0.370000 0.010000 0.380000 ( 0.371935)
.match? dynamic 0.260000 0.010000 0.270000 ( 0.278614)
Из эталонного теста мы видим огромный выигрыш от .match
до .match?
, но как только я начинаю динамически создавать сложныеРегулярное выражение в соответствии с требованиями моего приложения, я теряю большую часть прибыли.
Мой вопрос: почему существует такая радикальная разница и можно ли каким-то образом создать динамическое регулярное выражение, чтобы использовать производительность .matches?
впример ниже?Я проверил свои тесты, используя ruby 2.4.2p198
str = 'my text with words'
reg_str = '((^|[\s\"“])(cherry pie|cherry pies)($|[\s\"”\.\,\:\?\!])|(\#(cherrypie|cherrypies)($|\s|\#|\.|\,|\:|\?|\!)))'
puts Benchmark.measure {
100000.times { str.match? /#{reg_str}/i }
}
9.380000 0.010000 9.390000 ( 9.403821)
puts Benchmark.measure {
100000.times { str.match? /((^|[\s\"“])(cherry pie|cherry pies)($|[\s\"”\.\,\:\?\!])|(\#(cherrypie|cherrypies)($|\s|\#|\.|\,|\:|\?|\!)))/i }
}
0.020000 0.000000 0.020000 ( 0.017900)