[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 メーリングリストの案内