テクノロジー

「正規表現が0.002ミリ秒遅かった」という理由だけで、全角/半角判定をすべて『ビット演算』で実装した話 - Qiita

1: amd64x64 2026/06/19 02:10

WASMかN-APIで書いたら

2: dollarss 2026/06/19 02:43

“「正規表現エンジンのオーバーヘッド……許せねぇ……!」”気持はわかるけど実装しちゃうかなwめんどくさいを排除するためにどんなにめんどくさい事も厭わないソフトウェアエンジニアあるある

3: ilyaletre 2026/06/19 05:37

解決する問題を絞ることで仮定を作って最適化する。一般から特殊に解法をフォーカスさせる。お手本だ。

4: sgo2 2026/06/19 06:58

多分素直な数値比較が最速のはず

5: crimson_diamond 2026/06/19 06:59

失敗の共有素晴らしい、そう、爆速にこだわるなら、言語の選定から間違えている

6: restroom 2026/06/19 07:11

“……あれ? このコードを書くのに調べ物含めて 12時間 かかっているのですが、この 0.15秒 のリターンで投資を回収するには、一体何回このスクリプトを回せば”、趣味だからこういうのが楽しいのでしょう

7: chiroruxx 2026/06/19 07:35

それを半角と呼んでしまうのは危うい

8: korilog 2026/06/19 07:37

言語変えた方が早くない?

9: suka6411144 2026/06/19 08:15

比較と変わらないのはそれはそう、結局引き算するだけだしビット演算と対してコストは変わらない

10: dalmacija 2026/06/19 08:16

Java……Script……???でもこういうスタイルは好き

11: otoku-memo 2026/06/19 08:20

記事もコードもAIで書いてんのに12時間もかかるわけないと思うんだが…

12: mohno 2026/06/19 08:38

「正規表現で /[^\x20-\x7E]/ とか使えば一発じゃん」→そんなわけないよな、と思ったら、そんなわけなかった。むしろこんなシンプルな判定に正規表現を使う気はしないくらいだが、JavaScriptだからか意外に差がないんだな。

13: shodai 2026/06/19 08:57

“正規表現の落とし穴:\xA1-\xDF では半角カタカナを判定できない”

14: strawberryhunter 2026/06/19 08:59

数GBのログか。以前Perlで書いたら死ぬほど遅くてJavaで書いたら一瞬だったからNode.jsも一瞬だろう。でも良いと思う。

15: hecaton55 2026/06/19 09:12

興味深い

16: auto_chan 2026/06/19 09:14

たのしそうでよかった。プログラミングのおもしろさだね~。

17: sucelie 2026/06/19 09:24

10円安い商品のために隣町まで車で行くような話

18: tk_musik 2026/06/19 09:28

個別最適を実装してるときが一番楽しい。/ネットメディアに書いてもらったら見出しは「3倍超の速度アップに成功!」となり、最後に標準ライブラリは何をやってるのか的な批判で終わるんやろなぁ。

19: tofu-kun 2026/06/19 10:09

楽しそう

20: moxtaka 2026/06/19 10:22

前世紀の頃、SJISとJISとEUCでそれぞれマルチバイト判定をどうするかみたいなのは割とあるあるなテーマだった気がする。(まだUTF-8は一般的じゃなかった)

21: hiront_at_nagoya 2026/06/19 10:31

isascii()使えば良くね? と思ったらJava scriptなのね。

22: Angelfish3578 2026/06/19 10:45

ウケた「実務で使ったらコードレビューで燃やされます」

23: umaemong 2026/06/19 10:49

楽しそうだし、この経験が血肉となる。敢えて指摘すると、1文字の判定なら大多数が普通に数値比較で書くと思う。ビット演算結果を結局"比較"してることに気付こう。ちな、[\xA1-\xDF]はSJISの場合。

24: Fluss_kawa 2026/06/19 11:01

UUIDの比較に文字列そのままでやってて遅いっていうやつですね。あれはいったん数値に変換して比較するんですよ。

25: caffephilia 2026/06/19 11:33

ちゃんと速くできててすごい(学生のころ文字列探索アルゴリズムの講義があった後に find | xargs grep 的なコマンドがもっと早くならんかと機能を絞った grep を C でナイーブに書いたらアホみたいに遅かった思い出(隙自語

26: uunfo 2026/06/19 11:47

数値比較版と「同じ」「ほぼ同じ」「変わらない」と書いてるけど、数値比較版の方が速いじゃん

27: cl-gaku 2026/06/19 12:06

まあでもこういうのが血肉になるよね

28: oktnzm 2026/06/19 12:09

面白い実験だけど、Unicodeは半角/全角に二分できないし、実装例は制御文字も半角扱いになる点に注意。素直な範囲比較がよさげ。

29: nakag0711 2026/06/19 12:35

一文字ずつ判定したらそりゃ正規表現は遅いだろうけど正規表現の強みはそこにはない

30: MarvinParnroid 2026/06/19 12:46

エンジニアには、楽する為にはどんな努力も惜しまないと言うバグが実装されている。

31: tekimen 2026/06/19 13:02

ビット演算使って全角半角判定できるならSIMD使えるかもしれないなと思いました。 / あ、JavaScriptか。失礼しました

32: naoya2k 2026/06/19 13:27

Ä(U+00C4)を全角扱いしていいというのなら、もう、その半角ってのはU+007F以下だけを指定する言葉になっているだけなので、あとは蛇足でしかないんじゃないかなあ…

33: nekoline 2026/06/19 18:36

楽しそうだからブクマ