まつもと ゆきひろです

遅くなりました。

In message "Re: [ruby-dev:34005] Array#slice! may be too slow and allocate memory too much"
    on Fri, 7 Mar 2008 21:00:53 +0900, "Yusuke ENDOH" <mame / tsg.ne.jp> writes:

|以下のプログラムがやたら遅いです。また、メモリを大量に消費します。
|
|$ time ./ruby -ve '
|> a = [0] * 10000
|> (1 .. 10000).map { a.slice!(0, 1) }
|> '
|ruby 1.9.0 (2008-03-07 revision 15720) [i686-linux]
|
|real    0m10.940s
|user    0m4.200s
|sys     0m6.710s
|
|
|配列の共有が原因のようです。

考えてみるとspliceは必ず直後に配列を書き換えるので共有しては
いけないのでしょう。共有を行わないsubseqを使うと速度が劇的に
改善しました。これは1.8にも適用されるべきでしょう。

|これを何とかするのはいろいろと面倒そうです。
|
|a = [0] * 10000
|(1 .. 10000).map { t = a[0, 1]; a[0, 1] = []; t }

これはこれで考えないといけませんかねえ。