https://github.com/ruby/ruby/pull/537
以下を処理するのにものすごく時間がかかる。
n = 1000000 a = (0..n).to_a;nil while a.shift(2).length != 0 end
nが10000とかなら気にならないレベルなんだけど、1000000となると数分かかる。 これをどんな長さでも瞬時に終わらせる修正だった。
これを投げた時、更にアイデアがあった。
「このaryはARY_SHARED_PであることはあってもARY_SHARED_OCCUPIEDになることはなくない?」
というもの。
そもそもそれが間違いで、ary_make_partial
内のlen
をaryの長さだと取り違えていたのだった。
なのでARY_SHARED_OCCUPIEDになることはありうる。
また、その中のary_mem_clear
もGC漏れを防ぐために設置されたものなので必要。
完全に間違えていた。
なぜ要らないと思ったかといえばtestでその部分を通らなかったからで、これはカバレッジを上げるためにここんとこを通るテストコードも追加したほうがいいんじゃないだろうか。
と思ってテストも追加する。
まあ採用されるかわからないけどあたたかくお見守り下さい。