[Tokyo.pm] jus Benkyoukai

Kazumasa Utashiro utashiro @ iij.ad.jp
1999年 9月 20日 (月) 10:02:42 CDT


From: WATANABE Hirofumi <watanabe @ ase.ptg.sony.co.jp>
Subject: Re: [Tokyo.pm] jus Benkyoukai
Date: Mon, 20 Sep 1999 13:35:36 +0900

> ASCII だとたったの 16K ですね(って減らしてどうする).

あれれ、ASCII だと 256 バイトというのが間違いで、実際には32バイトなん
ですね。自分で調べたわけじゃないから、わざわざ断ったんですが。どこかで、
出てましたよね、256バイトって。

自分で調べもしないのも失礼なので、コードを少し見てみました。regcomp.h 
の

/* Utility macros for bitmap of ANYOF */
#define ANYOF_BYTE(p,c)     (p)[1 + (((c) >> 3) & 31)]
#define ANYOF_BIT(c)        (1 << ((c) & 7))
#define ANYOF_SET(p,c)      (ANYOF_BYTE(p,c) |=  ANYOF_BIT(c))
#define ANYOF_CLEAR(p,c)    (ANYOF_BYTE(p,c) &= ~ANYOF_BIT(c))
#define ANYOF_TEST(p,c)     (ANYOF_BYTE(p,c) &   ANYOF_BIT(c))

あたりを使っているようですね。これを見て思ったんですが、マッチしないこ
との方が多いと仮定すれば、

#define ANYOF_TEST(p,c) (ANYOF_BYTE(p,c) && (ANYOF_BYTE(p,c) & ANYOF_BIT(c)))

とした方が効率がいいような気がしますが、気のせいでしょうか。ANYOF_BYTE 
が2回出て来るのは最適化されることを前提にして。

> すみません. 現在は 32+4096+α バイトでした.
> 
> :ASCII が 256バイトなのだとすると、それに比べて数命令程度のペナルティで
> :検査できるということでしょうか。
> 
> そうですね. 8KB だとペナルティなしですけど, ASCII 分と
> 0x8000 以上の日本語だけを対象にしてるので 4KB になります.
> この操作にペナルティがかかります.

検査のペナルティについては、ASCII の場合は256バイトということを前提に
してました。どちらもビットマップするのであれば、無視できると思います。

> :8K が大きすぎないかどうかは判断が難しいところです。64K だともちろん話
> :になりませんが、8K だとしても100回使ってあれば 800K になって、ちょっと
> :気になる量になってきます。最近はそのくらいは気にしないとしても、500回
> :で 40M になると、僕が今使っているような主記憶 40M のマシン (DHU2) では
> :結構なストレスです。ASCII なら、たったの 128K ですからかなりの違いです。

> なんか途中で一桁間違ってる気がするんですけど,
> 500 回だと 4M ですよね(実際はその半分の 2M).

大変失礼しました。時差惚けのせいにしておいて下さい :)。500回で 4M、
1000回で 8M 程度 (実際にはその半分) であれば、今の計算機環境を前提とす
れば許容されますね。5000回なら40Mだろ、というのは説得力のない主張になっ
ちゃいます。

> 実際はずーっとその文字クラスが存在してるわけではないですよね?
> free されると思うんですけど.
> 逆に回数が増えると malloc/free の時間的なコストという問題はあるかも.

領域は parse 時に確保されて、終了するまでそのままだと思っているのです
が、違いますか? 変数展開がある場合も、次に展開されるまではそのままのは
ずなので、あまり影響はありませんよね。code reference のような特殊な場
合は、よくわかりませんが。

--utashiro



Tokyo-pm メーリングリストの案内