Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

正規表現のセッションその後

アンケートの結果を拝見させてもらいました。
おかげ様で期待度と広めたい度はPLUSでした。ありがとうございました。
残念ながら、ご理解度が、低めでした。好意的なご意見から推察すると、時間と内容がアンバランスだったと反省してます。
構文は周知されている判断して、構文解説をしなかったのですが、裏目になったようでした。
「興味はあるが、深くは知られていない」という面を感じました。
ブログでも発信してみようかなと思った次第です。

 セッションで実行速度の比較をしてみたのですが、興味深いというか、自分が吃驚したことがあります。
元になるデータは、郵便局が配布している郵便番号のCSVデータで、この中から、神戸市と大阪市のデータを抽出するものです。
1. if (line.IndexOf(\"大阪市\") > -1 || line.IndexOf(\"神戸市\") > -1)  で:言語で抽出
2. "^.*(大阪市|神戸市).*$" : (Compile optionで処理)

この二種類ですが 

AMD64*2  で VS2008 で行うと   1: 0.9秒   2:1.7秒  となり、順当感が有ります。
ところが、
Intel Centrino で行うと       1: 1.1秒   2:0.9秒  となり、??な結果    Regex処理の方が早い!!

ILレベルでみても、差が見付けられなかったのですが、 CPUの差なのかなぁ。
(AMDでみてみると)なんとなく、Regexでは遅いようなイメージがありますが、言語の倍程度です。
十分実用に耐えうる速度だと考えます。

投稿日時 : 2008年8月28日 1:07

Feedback

# re: 正規表現のセッションその後 2008/08/28 11:44 st.lain

セッションお疲れ様でした。MISAOで魔境だ~と言った
クチですが、IndexOf等で判断するよりは正規表現のが
スキーです(w

こちらでもちょっとやってみました。

--- 環境 ---
OS: Windows Vista Ultimate SP1 (x64)
VS: Visual Studio 2008 Standard Edition SP1
CPU: AMD Turion 64 2.0GHz (TL-60)

--- 結果(Target: x64) ---
IndexOf -> 1.1秒
Regex -> 3.4秒

--- 結果(Target: x86) ---
IndexOf -> 1.1秒
Regex -> 2.6秒

ほぼほぼ似た感じではあると思います。で、ふと思ったのが、
> "^.*(大阪市|神戸市).*$"
ってIndexOfに比べて不利な条件になってないでしょうか?

私的には以下で十分であると思っています。
> "(大阪市|神戸市)" or "(大阪|神戸)市"

Intel環境が一切ないのでCPU云々は測れませんが、
正規表現の方が早くならないでしょうか。(というか、そうあって欲しいな~w)

# re: 正規表現のセッションその後 2008/08/28 16:05 Ognac

コメントありがとうございます。

>--- 結果(Target: x64) ---
>IndexOf -> 1.1秒
>Regex -> 3.4秒
>
>--- 結果(Target: x86) ---
>IndexOf -> 1.1秒
>Regex -> 2.6秒

x64とx86で差が出るということは、 Regexの処理が、内部最適化処理が入っているのかしら。


手元にある 別の Intel Centrino ノートで試してみました

IndexOf : 01.0468750(単位秒)
^.*(大阪市|神戸市).*$ : 00.6562500
^.*(大阪|神戸)市.*$ : 00.6875000 市で括っても必ずしも早くは成りませんね
^.*(大阪|神戸)市 : 00.6875000
(大阪|神戸)市.*$ : 00.6718750
(大阪|神戸)市 : 00.7968750
.*(大阪|神戸)市.* : 16.8125000

Regexの方が早いです。此の差はどこから来るのだろう。Regexの実行仕様は奥深そうです。
文頭、文末を明記した方が早いですね。
不用意に .* を付けると極端に遅くなるのは、確認できます。
その他は、誤差の範囲+αの感じです。

# re: 正規表現のセッションその後 2008/08/28 18:23 st.lain

> 市で括っても必ずしも早くは成りませんね
こちらでも差がないことを確認しました。多分ですが、
「市」の部分が長かろうと短かろうと重さは変わらないと
思いますが、PGの可読性では共通項は外に出したほうが
無難カナ程度だと思ってます。

> 文頭、文末を明記した方が早いですね。
AMDだと文頭文末明記で重くなってしまうのですよね・・・。
明記しないと0.7秒と早くなってしまうのです。
何ともびみょ~な感じですが・・・。

> .*(大阪|神戸)市.*
ぅ、これは重いですね。応答なくなってデバッガ
落としちゃいました orz

> Regexの実行仕様は奥深そうです。
ホント、動作しかり、デバッグの仕方しかり、奥が深すぎですね(汗

タイトル
名前
Url
コメント