«前の日記(2008年08月05日) 最新 次の日記(2008年08月07日)» 編集

Matzにっき


2008年08月06日 [長年日記]

_ 夏休み

帰省している間、ネットから隔絶されているので、 この機会に「いつか手をつけようと思ってた問題」を片づけよう。

rb_enc_check

ふたつのオブジェクトのエンコーディングに互換性があるかどうかをチェックする関数 rb_enc_checkだが、Rubyのソースコード全体に19箇所登場しているすべてが ふたつの文字列のエンコーディングを比較していた。

ということは、文字列専用のチェックにすればもっと高速化するのでないだろうか。

そう思って試してみたのだが、 測定する限りでは誤差の範囲内しか効果がないようであった。

US-ASCII文字列のcoderange

US-ASCII文字列は本来7bitの範囲内の文字しか含まないはずなので、 これを利用するとcoderangeチェックが節約できるはず。

と思ったが、測定結果これまた効果なし。

rb_big2str0結果のcoderange

Integer#to_sの結果はいつもUS-ASCIIでcoderangeは7bitに決まっている。 ので、あらかじめ7bitフラグを立てることを考えてみた。 が、よっぽど長い文字列(すごく大きな整数)を取り扱わない限り、差はないようである。

Class.dupの動作

現在、Ruby 1.8の動作とRuby 1.9でClass.dupを行った時の 定数、クラス定数の振る舞いが異なる。

で、1.9の動作(つまり昔の1.8の動作)が正しいと思っていたのだが、 この機会にいろいろ考えてみたら、やっぱり1.8の動作が望ましいが、 現在の1.8にはバグがある(バグを直した動作が「正しい」)ということが 分かった。

で、1.8ではその「バグ」を直したのだが、 問題は1.9でこの挙動をどうやって実現すればよいのかわからないことだ。

かなり長い時間ソースコードを解析して、 Methodが指しているiseqがcref_stackを持っていることが分かったので、 対策としては

  • iseqをコピーしてcref_stackを書き換える
  • cref_stack以外は元のiseqを参照するという特別なiseqを作る
  • メソッドのcref_stackトップをiseqではなく、NODE_METHODから取る

などを考えついたが、実際に動かすところまでには持っていけなかった。

まとめ

今回は時間はかかった(休みだから余裕はあった)が、 成果はほとんどなかった。残念

_ 山口ちょうちん祭

姪っ子と うちの子供たちを連れて山口市の「ちょうちん祭」にでかける。 今回の帰省の最大の目的でもある。

娘たちの浴衣姿とかとてもかわいらしかった。

人ごみは苦手だけど、祭りならなんとか耐えられるかな。


«前の日記(2008年08月05日) 最新 次の日記(2008年08月07日)» 編集