< ピアノレッスン118回目 | ピアノレッスン119回目 >
2014/02/12
文字列の部分共有
JavaのString実装が変更になった話。以前はsubstringは部分文字列を 共有してたけど、でかい文字列の一部だけを参照しつづけるような使い方だと メモリリークが問題になるってことで、部分文字列共有をやめたそうだ。
Gaucheも部分文字列を共有する実装なんでこれは気になる。
Cとのやりとりを置いとくなら、文字列のフラグメントを木にして管理するのが 良いとは思うのだけれどね。そうすれば
- 文字列接合もO(1)になる
- substringは部分木もしくはフラグメントを共有するだけなので、余分なメモリをretainしない
- 木のノードに文字オフセットを持たせておけば、マルチバイト文字列のインデックスアクセスが現在のO(n)からO(log n)になる
わりと良いことづくめ。ただ、Cに渡す時に木をフラットな文字配列に直さないと ならないので、Cを頻繁に呼び出す時のオーバヘッドが大問題。
一度フラットな配列にしたらそれをキャッシュしておくことはできるけれど、 その場合、C呼び出しに使った文字列は2倍のメモリを消費し続けることになる。
妥協案として、フラットな配列の方への参照をweakにしておくという手はあるかも。 それならもう使わないキャッシュはいずれ回収される。
かなり大きな変更になるし、性能評価してみないと何とも言えないから、 やるとしたら1.0以降かなあ。
Tag: Gauche
通りすがりです (2014/02/13 01:52:06):
shiro (2014/02/13 04:58:52):
shiro (2014/02/13 05:09:14):
Kei (2014/02/13 16:21:47):
shiro (2014/02/14 06:21:36):