[#2023] Class Method の index — (Dezawa Shin-ichiro) <dezawa@...>

出沢です

13 messages 1997/02/02

[#2158] [Req] pack/unpack — keiju@... (Keiju ISHITSUKA)

けいじゅ@SHLジャパンです.

14 messages 1997/02/18
[#2166] Re: [Req] pack/unpack — matz@... (Yukihiro Matsumoto) 1997/02/18

まつもと ゆきひろです.

[#2277] ruby 1.0-970228 available — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです.

16 messages 1997/02/28

[ruby-list:2168] Re: b64encode.rb

From:
Date: 1997-02-18 09:35:22 UTC
List: ruby-list #2168
けいじゅ@SHLジャパンです. 

In [ruby-list :02164 ] the message: "[ruby-list:2164] b64encode.rb ",
on Feb/18 17:20(JST) sinara@blade.nagaokaut.ac.jp writes:

>それから、前から気づいていたのですが、大きなファイルに
>対して
>
>encode = []
>    encode << uu[0, len].tr('` -_', 'AA-Za-z0-9+/')
>
>としているところを
>
>encode = ""
>    encode += uu[0, len].tr('` -_', 'AA-Za-z0-9+/')
>
>とすると、メモリを使いきってスラッシングを始めてしまいます。
>
>perl ではそんなことがないのですが、ruby は String#+= の
>やり過ぎに弱いのではないでしょうか?

String#+= は, 文字列オブジェクトを新たに生成しますので, 昔の文字列オブ
ジェクトがGCの対象となりそれがスラッシングの原因になっているような気が
します.

String#+= の代わりに String#concat を用いられたらいかがでしょうか? こ
ちらは元の文字列に直接結合しますので, ゴミオブジェクトの発生はなくなる
(少なくなる?)と思います.

time b64encode.rb /usr/local/bin/ruby > /dev/null

を行なうと:

配列版:
248.9u 0.8s 4:18 96% 0+1872k 2+0io 0pf+0w

String#concat版:
251.6u 0.5s 4:26 94% 0+1852k 2+0io 0pf+0w

ということで, 配列版とあまり変わらなくなります.

ところで, String#+=版を実行すると...

うーん... 帰ってこない!! プロセスサイズが 89MB になっても終らない...
どうも, 参照の切れた文字列が回収されていないようですね. GCにばぐがある
んじゃないですか!?

__
..........................................石塚 圭樹@SHLジャパン(株)...
------------->アドレス変わりました!! e-mail: keiju@shljapan.co.jp <----

In This Thread