💨
[Misc #20652] String#gsub でメモリが増加する報告
[Misc #20652] Memory allocation for gsub has increased from Ruby 2.7 to 3.3
- Ruby 2.7.7 から Ruby 3.3.1 にアップデートしたら
String#gsub
のメモリ割当が増加しているという報告 - 次のようなコードのときに
MatchData
関連で増加しているとのこと
s = "foo "
s.gsub(/ (\s+)/) { " #{' ' * Regexp.last_match(1).length}" }
-
Bug #17507: Regexp capture groups ignored sometimes in some multithreaded environments (possible race condition) の対応の副作用らしい
- こっちはマルチスレッド環境で
MatchData
関連で不具合が発生してたみたい- マルチスレッド環境なのに特定の条件で
$~
の値が共有オブジェクトになっている話ぽい? - なのでマルチスレッド関係なく
$~
が同一にならないように対応した結果メモリが増加しているみたい
- マルチスレッド環境なのに特定の条件で
- こっちはマルチスレッド環境で
- 以下のように正規表現のオプションで
MatchData
の生成を制御したりする案や #17507 の別対応をするかどうかなど議論されてます
case str
when /^a/
p $~ # => #<MatchData "a">
when /^b/c # c オプションがある場合は MatchData を内部で生成しない
p $~ # => nil
end
Discussion