ひらがな判定 その2

ふと思った。 最近そればかりだからナチュラルにUTF-8を使っていたが、Shift-JISで処理したらどうなるんだろう?

       public static bool IsKana3(string target) {
            foreach (var chara in target) {
                var charaData = Encoding.GetEncoding(932).GetBytes(chara.ToString());

                if (charaData.Length < 2) {
                    return false;
                }

                var charaInt = (charaData[0] << 8) + charaData[1];

                if (charaInt < 0x829f || charaInt > 0x82f1) {
                    return false;
                }
            }

            return true;
        }

テストメソッドは同様。

すると、2番と同等のレベルまで早くなった。 どちらも1ミリ秒を下回って比較出来なくなったので、テストを1万回ループさせた所、2番目の方法が70ミリ秒、今回の方法が9ミリ秒になった。 マジか。 僕の想定通りの結果にはなったが、ここまで違うとは。

そして、UTF-8かShift-JISかという違いだけでここまで速度に差が出るとは。 サロゲートペアやら、UTF-8は色々混沌とし過ぎているからその辺りで処理が面倒な感じになっているのだろうか? でも、GetBytesは単に文字を16進数にするだけだから、そういう辺りで細々と考慮するだのしないだのという話にはならないだろうしなぁ。 うーん、謎だ。

まあ、細かい事は置いといて。 結論。日本語はShift-JISで文字コードの比較をして扱おう。