文字種判定処理、is~()

ctype.hのisupperとかisdigitとかのメモ。
マルチバイト関係は無視。1byte前提。

 基本的な動作は、文字と対になるbyteの配列を参照する(msvcrtの_pctype[]はshortの配列ぽい)。
 byteにはビットフラグとしてbit数分だけ種別を格納出来る(ビットマスクで取り出せる)、と。
 ascii専用でchar hoe[128]の俺種別を作るのもあり。

速度的なこと。

 1) crtの関数表記そのまま。
 2) crtの(_pctype[c]&MASK)。 非関数。
 3) crtの_isctype(c, MASK)。
 4) 用途を限定し、MASK無しで俺配列を参照するもの。 (2の亜種。 非関数。 配列は同一関数orモジュール内。
 5) (4)を関数化した物。 配列はstaticで関数内に持つ。
 6) if-elseの関数。

 一番コストの高そうなxdigitの場合、こんな感じになった。 対象文字列は適当に作った物。 数学的なランダムさとかは知らね。
   速 (4) < (2) << (1)(6) << (5) << (3) 遅

 (4)と(2)は1割程度、(2)と(1)は倍、(1)と(5)はさらに倍、(5)と(3)はさらに倍。
 (4)と(3)では10倍近く違った。

 

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック