• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
並列化と実行時コード生成を用いた正規表現マッチングの高速化
 

並列化と実行時コード生成を用いた正規表現マッチングの高速化

on

  • 1,595 views

日本ソフトウェア科学会第28回大会(2011/9)での発表資料です。JITはもっと最適化してるんですが時間の都合で軽めに発表。

日本ソフトウェア科学会第28回大会(2011/9)での発表資料です。JITはもっと最適化してるんですが時間の都合で軽めに発表。
「高速化はやりきった?」← まだまだでした。

Statistics

Views

Total Views
1,595
Views on SlideShare
1,586
Embed Views
9

Actions

Likes
1
Downloads
6
Comments
0

3 Embeds 9

http://us-w1.rockmelt.com 4
https://si0.twimg.com 3
http://safe.tumblr.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    並列化と実行時コード生成を用いた正規表現マッチングの高速化 並列化と実行時コード生成を用いた正規表現マッチングの高速化 Presentation Transcript

    • 並列化と実行時コード生成を用いた 正規表現マッチングの高速化 東京工業大学 新屋 良磨 佐々 政孝 サイボウズ・ラボ 光成 滋生Tuesday, March 27, 12
    • 研究概要 目的 正規表現マッチングの高速化 → 数多くの既存実装を超えたい 提案手法Tuesday, March 27, 12
    • 研究概要 目的 正規表現マッチングの高速化 → 数多くの既存実装を超えたい 提案手法 マッチングの並列化Tuesday, March 27, 12
    • 研究概要 目的 正規表現マッチングの高速化 → 数多くの既存実装を超えたい 提案手法 マッチングの並列化 実行時コード生成Tuesday, March 27, 12
    • 研究概要 目的 正規表現マッチングの高速化 → 数多くの既存実装を超えたい 提案手法 マッチングの並列化 →併用可能 実行時コード生成Tuesday, March 27, 12
    • 研究成果 •効率の良い並列マッチングをオートマトンの自然 な拡張によって実現した. → SFA •マッチングにコード生成を用いることで, 3倍以上 の高速化に成功した. •実装は公開 → http://github.com/sinya8282/regenTuesday, March 27, 12
    • 発表の流れ 1. 正規表現マッチングの説明(既存手法) 2. マッチング並列化の説明 (提案手法1) 3. 実行時コード生成の説明 (提案手法2) 4. 性能評価 - ベンチマーク 5. まとめTuesday, March 27, 12
    • 正規表現マッチングTuesday, March 27, 12
    • 正規表現 •正規言語(3型文法)を認識できる文法. •多くのシステムで活用(lex, grep, IDS....) 正規表現マッチング = 有限オートマトンの動作 •DFA: 有限の状態, 決定的な遷移 •NFA: 有限の状態, 非決定的な遷移Tuesday, March 27, 12
    • DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0Tuesday, March 27, 12
    • DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 ab aaTuesday, March 27, 12
    • DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 a b a aTuesday, March 27, 12
    • DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 q0 a b a aTuesday, March 27, 12
    • DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 q0 a q1 b a aTuesday, March 27, 12
    • DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 q0 a q1 b q3 a aTuesday, March 27, 12
    • DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 q0 a q1 b q3 a q1 aTuesday, March 27, 12
    • DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 q0 a q1 b q3 a q1 a q2Tuesday, March 27, 12
    • DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 受理状態(二重丸)に遷移する. よってこのDFAはabaaを受理!! q0 a q1 b q3 a q1 a q2Tuesday, March 27, 12
    • NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2Tuesday, March 27, 12
    • NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 ab aaTuesday, March 27, 12
    • NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 a b a aTuesday, March 27, 12
    • NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 q0 a b a aTuesday, March 27, 12
    • NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 q0 a q0 b a a q1Tuesday, March 27, 12
    • NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 q0 a q0 b q0 a a q1 q2Tuesday, March 27, 12
    • NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 q0 a q0 b q0 a q0 a q1 q2 q1Tuesday, March 27, 12
    • NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 q0 a q0 b q0 a q0 a q0 q1 q1 q2 q1 q2Tuesday, March 27, 12
    • NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 受理状態に遷移する場合がある. よってこのNFAはabaaを受理!! q0 a q0 b q0 a q0 a q0 q1 q1 q2 q1 q2Tuesday, March 27, 12
    • NFA・DFAの性質 NFA DFA 状態の定義 q ∈ Qn q ∈ 2Qn 状態数 |Qn| |Qn| = O(|R|) O(2 ) マッチング O(Nx|Qn|) O(N) 計算量 NFAからDFAを構築: 部分集合構成法 |R|: 正規表現の長さ |Qn|: NFAの状態数 N: テキストの長さ        Tuesday, March 27, 12
    • マッチングの並列化Tuesday, March 27, 12
    • マッチングの並列化 = 状態遷移の並列化 a b a a •のように文字単位で並列に実行したいTuesday, March 27, 12
    • マッチングの並列化 = 状態遷移の並列化 q0 a b a a •のように文字単位で並列に実行したいTuesday, March 27, 12
    • マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •のように文字単位で並列に実行したいTuesday, March 27, 12
    • マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •このような状態遷移を •のように文字単位で並列に実行したいTuesday, March 27, 12
    • マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •このような状態遷移を a b a a •のように文字単位で並列に実行したいTuesday, March 27, 12
    • マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •このような状態遷移を a b a a •のように文字単位で並列に実行したいTuesday, March 27, 12
    • マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •このような状態遷移を ? a b ? a a •のように文字単位で並列に実行したいTuesday, March 27, 12
    • マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •このような状態遷移を ? a ? b 結果1 ? a ? a 結果2 •のように文字単位で並列に実行したいTuesday, March 27, 12
    • マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •このような状態遷移を ? a ? b 結果1 q2 ? a ? a 結果2 •のように文字単位で並列に実行したいTuesday, March 27, 12
    • 並列マッチング: 先行研究 •Lander, Fisher(1980): 「Parallel Prefix Computation」 •松崎(2011): 「正規表現マッチングの並列化とその Hadoopでの評価」 •DFAベース並列マッチング •O((N/P+logP)|Qd|) •NFAベース並列マッチング •O((N/P+logP)|Qn|3 ) |Qn|, |Qd|: NFA,DFAの状態数 N: テキストの長さ P: 並列度Tuesday, March 27, 12
    • マッチングを並列化するには? •状態遷移は常に「直前の状態」に依存しており, 単純に並列化できない.Tuesday, March 27, 12
    • マッチングを並列化するには? •状態遷移は常に「直前の状態」に依存しており, 単純に並列化できない. 「各状態を初期状態とした全パターン」について  状態遷移を計算. 結果を最後にまとめる.Tuesday, March 27, 12
    • 並列マッチングの例 a /[ab]*a[ab]/ abaa q2 DFA a b b q1 q3 b a a b q0Tuesday, March 27, 12
    • 並列マッチングの例 a /[ab]*a[ab]/ q2 DFA a b b a b q1 q3 b a a b q0 a aTuesday, March 27, 12
    • 並列マッチングの例 a /[ab]*a[ab]/ q2 DFA a b b q0 q0 a b q1 q3 b a a q1 q1 b q0 q2 q2 q3 q3 q0 q0 q1 q1 a a q2 q2 q3 q3Tuesday, March 27, 12
    • 並列マッチングの例 初期状態 a /[ab]*a[ab]/ q2 DFA a b b q0 q0 a b q1 q3 b a a q1 q1 b q0 q2 q2 q3 q3 q0 q0 q1 q1 a a q2 q2 q3 q3Tuesday, March 27, 12
    • 並列マッチングの例 初期状態 a 遷移状態 /[ab]*a[ab]/ q2 DFA a b b q0 q0 a b q1 q3 b a a q1 q1 b q0 q2 q2 q3 q3 q0 q0 q1 q1 a a q2 q2 q3 q3Tuesday, March 27, 12
    • 並列マッチングの例 初期状態 a 遷移状態 /[ab]*a[ab]/ q2 DFA a b b q0 q0 q0 q1 a b q1 q3 b a a q1 q1 q1 q2 b q0 q2 q2 q2 q2 q3 q3 q3 q1 q0 q0 q0 q1 q1 q1 a q1 q2 a q2 q2 q2 q2 q3 q3 q3 q1Tuesday, March 27, 12
    • 並列マッチングの例 初期状態 a 遷移状態 /[ab]*a[ab]/ q2 DFA a b b q0 q0 q0 q1 a b q0 q3 q1 q3 b a a q1 q1 q1 q2 b q1 q3 q0 q2 q2 q2 q2 q2 q3 q3 q3 q3 q1 q3 q3 q0 q0 q0 q1 q0 q2 q1 q1 a q1 q2 a q1 q2 q2 q2 q2 q2 q2 q2 q3 q3 q3 q1 q3 q2Tuesday, March 27, 12
    • 並列マッチングの例 初期状態 a 遷移状態 /[ab]*a[ab]/ q2 DFA a b b q0 q0 q0 q1 a b q0 q3 q1 q3 b a a q1 q1 q1 q2 b q1 q3 q0 q2 q2 q2 q2 q2 q3 q3 q3 q3 q1 q3 q3 q0 q0 q0 q1 q0 q2 q1 q1 a q1 q2 a q1 q2 q2 q2 q2 q2 q2 q2 q3 q3 q3 q1 q3 q2Tuesday, March 27, 12
    • 並列マッチングの例 初期状態 a 遷移状態 /[ab]*a[ab]/ q2 DFA a b b q0 q0 q0 q1 a b q0 q3 q1 q3 b a a q1 q1 q1 q2 b q1 q3 q0 q2 q2 q2 q2 q2 q3 q3 q3 q3 q1 q3 q3 q0 q0 q0 q1 q0 q2 q1 q1 a q1 q2 a q1 q2 q2 q2 q2 q2 q2 q2 q3 q3 q3 q1 q3 q2Tuesday, March 27, 12
    • 並列マッチングの例 初期状態 a 遷移状態 /[ab]*a[ab]/ q2 DFA a b b q0 q0 q0 q1 a b q0 q3 q1 q3 b a a q1 q1 q1 q2 b q1 q3 q0 q2 q2 q2 q2 q2 q3 q3 q3 q3 q1 q3 q3 結果からq0 → q3 → q2 q0 q0 q0 q1 q0 q2 と遷移することが解る. q1 q1 a q1 q2 a q1 q2 q2 q2 q2 q2 q2 q2 abaaは「マッチする」 q3 q3 q3 q1 q3 q2 並列実行ができた!Tuesday, March 27, 12
    • SFA - 同時状態FA 提案手法1 •全状態を初期状態とした遷移を同時に行う. •初期状態から遷移状態の写像を状態として扱う. •部分集合構成法の自然な拡張で構築できる.Tuesday, March 27, 12
    • SFA - 同時状態FA 提案手法1 •全状態を初期状態とした遷移を同時に行う. •初期状態から遷移状態の写像を状態として扱う. •部分集合構成法の自然な拡張で構築できる. オートマトンの自然な拡張 並列実行のための提案モデル 同時状態FA SFA (Simultaneous FA)Tuesday, March 27, 12
    • DFAからSFAの構築 a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0Tuesday, March 27, 12
    • DFAからSFAの構築 a q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 b q0Tuesday, March 27, 12
    • DFAからSFAの構築 a q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a q0 b q0 q1 q1 q2 q2 q2 q3 q1Tuesday, March 27, 12
    • DFAからSFAの構築 a q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a b q0 b q0 q1 q0 q0 q1 q2 q1 q3 q2 q2 q2 q3 q3 q1 q3 q0Tuesday, March 27, 12
    • DFAからSFAの構築 a q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a b q0 b q0 q1 q0 q0 q1 q2 q1 q3 q2 q2 q2 q3 q3 q1 q3 q0 a ba bTuesday, March 27, 12
    • DFAからSFAの構築 a q’0 q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a b q0 b q0 q1 q0 q0 q1 q2 q1 q3 q2 q2 q2 q3 q3 q1 q3 q0 a ba bTuesday, March 27, 12
    • DFAからSFAの構築 a q’0 q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a b q0 b q’1 q0 q1 q0 q0 q1 q2 q1 q3 q2 q2 q2 q3 q3 q1 q3 q0 a ba bTuesday, March 27, 12
    • DFAからSFAの構築 a q’0 q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a b q0 b q’1 q0 q1 q’2 q0 q0 q1 q2 q1 q3 q2 q2 q2 q3 q3 q1 q3 q0 a ba bTuesday, March 27, 12
    • DFAからSFAの構築 a q’0 q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a b q0 b q’1 q0 q1 q’2 q0 q0 q1 q2 q1 q3 q2 q2 q2 q3 対応構成法 q3 q1 q3 q0 写像の遷移から a ba b 状態の遷移に変換!Tuesday, March 27, 12
    • DFAからSFAの構築 (cont) a /[ab]*a[ab]/ q2 DFA a b b q1 q3 b a a b q0Tuesday, March 27, 12
    • DFAからSFAの構築 (cont) a /[ab]*a[ab]/ 対応構成法 q2 DFA a b b q1 q3 b a a b a q0 b b q2 b q0 q6 a b a q1 b b q4 q5 SSFA a a b a a q3Tuesday, March 27, 12
    • NFA・DFA・SFAの性質 SFA SFA NFA DFA from DFA from NFA 状態の定義 q ∈ Qn q ∈2 Qn q ∈ (Qd→Qd) q ∈ (Qn→2 ) Qn 2 状態数 |Qn| |Qd| |Qn| |Qn| = O(|R|) |Qd| = O(2 ) O(|Qd| ) O(2 ) マッチング O(N/P+P) O(N/P+P|Qn|) O(Nx|Qn|) O(N) 計算量 O(N/P+|Qd|logP) O(N/P+|Qn|3logP) |R|: 正規表現の長さ |Qn|: NFAの状態数      N: テキストの長さ |Qd|: DFAの状態数      P: 並列度 A→B : AからBへの写像全体の集合 2 A : Aの冪集合Tuesday, March 27, 12
    • SSFA - 効率の良い並列マッチング •SFAの状態遷移は決定的 → DFAと同等 •SFAは受理判定が特殊(並列実行結果のreduce) •マッチングの計算量(N: テキスト長) •DFA : O(N) •SFA(from DFA): O(N/P+P) or O(N/P+|Qd|logP)Tuesday, March 27, 12
    • SSFA - 効率の良い並列マッチング •SFAの状態遷移は決定的 → DFAと同等 •SFAは受理判定が特殊(並列実行結果のreduce) •マッチングの計算量(N: テキスト長) •DFA : O(N) •SFA(from DFA): O(N/P+P) or O(N/P+|Qd|logP) N = P の時 O(P) or O(|Qd|logP) N >> P の時 O(N/P)Tuesday, March 27, 12
    • 提案手法2 実行時コード生成Tuesday, March 27, 12
    • 既存のマッチング実装(DFA) •状態遷移のコードは完全に静的な記述. •状態遷移に必要な二次元配列は動的に構築.Tuesday, March 27, 12
    • コード生成を用いたマッチング実装(DFA) q0: if (str == end) return 0; //状態番号 if (*str++ - ’A’ < ’B’ - ’A’ + 1) goto q1; else goto reject; q1: if (str == end) return 1; static const void*q1_table[256] = { [0 ... 255] = &reject; [‘A’ ... ‘B’] = &q1; [‘C’] = &q2; }; [A-B] goto *q1_table[*str++]; q2: if (str == end) return 2; [A-B] C goto reject; q0 q1 q2 reject: return -1; *説明のためC言語で記述.(実際はX86ネイティブコード) •状態遷移はコード間のジャンプ命令→ PCが状態! •受理判定は生成コード呼び出し側で行う.Tuesday, March 27, 12
    • 生成コード(DFA) エントリー (レジスタ調整,初期状態へジャンプ) 状態コード詳細 (24 Byte) 状態0のコード 状態1のコード 状態遷移テーブル •コード生成は JIT ライブラリ Χbyak を使用. •Χbyak: サイボウズ・ラボ 光成氏が開発.Tuesday, March 27, 12
    • コード生成の利点 •状態ごとに異なるアドレスのコードを実行. •命令/データキャッシュを有効に使える. •正規表現に最適化されたコードを生成可能.Tuesday, March 27, 12
    • 遷移規則に依るコード生成の最適化 通常はテーブルルックアップ [A-B] C q0 q1 q0: if (str == end) return 0; static const void*q0_table[256] = { [0 ... 255] = &reject; [‘A’ ... ‘B’] = &q0; [‘C’] = &q1; }; goto *q0_table[*str++]; q1: if (str == end) return 1; else goto reject;Tuesday, March 27, 12
    • 遷移規則に依るコード生成の最適化 cont 1つの条件分岐で住む場合 単純比較 q0: if (str == end) goto reject; if (*str++ == ‘A’) goto q1; else goto reject; A q0 q1 q1: if (str == end) goto 1; else goto reject; 範囲比較 q0: if (str == end) goto reject; if (*str++ - ’A’ < ’Z’ - ’A’ + 1) goto q1; else goto reject; [A-Z] q1: if (str == end) goto 1; q0 q1 else goto reject;Tuesday, March 27, 12
    • 遷移規則に依るコード生成の最適化 cont’ •遷移先を1つの分岐命令で判定 •メモリ(テーブル)アクセスが不要 •分岐予測が効く!!! •単純比較, 範囲比較以外にも考えられる?(要はswitch最適化)Tuesday, March 27, 12
    • 遷移規則に依るコード生成の最適化 cont’ •遷移先を1つの分岐命令で判定 •メモリ(テーブル)アクセスが不要 •分岐予測が効く!!! •単純比較, 範囲比較以外にも考えられる?(要はswitch最適化) 分岐先が限定されるので, コードの展開も可能. 固定/範囲文字が連続してるほど最適化しやすい. ex: http://[a-z]{4}.comTuesday, March 27, 12
    • 性能評価Tuesday, March 27, 12
    • ベンチマーク条件 マシン •CPU: Intel Core I7 X980 •3.33GHz, SpeedStep/TurboBoost はOFF •6物理コア, 12スレッド •Memory: 24GB DDR-SDRAM3 内容 •マッチングは完全一致での判定 •入力文字列はプロセス内でメモリ上に生成 •比較として Google RE2 (DFAベース実装)Tuesday, March 27, 12
    • ベンチマーク: コード生成マッチング Google RE2 コード生成無し DFA コード生成有り DFA 3GB/sec 2.5GB/sec Fast Throughput 2GB/sec 1.5GB/sec 1GB/sec 0.5GB/sec Slow 0GB/sec 最適化が効かないパターン 最適化が効くパターン /(([02468][13579]){5})*/ /(0123456789)*/ •コード生成で正規表現に依らず3倍の高速化. •最適化が効く正規表現の場合は更に高速に.Tuesday, March 27, 12
    • ベンチマーク: コンパイル時間 DFAの状態数 128 256 512 1024 2048 状態の計算時間 0.05s 0.122s 0.289s 0.676s 1.568s 状態の計算&  0.05s 0.116s 0.290s 0.683s 1.583s コード生成時間 •1500状態程度のDFAは1秒程度で構築&コード生成 •コード生成時間は無視できるほど小さい •*コード生成は状態数の線形オーダーで可能Tuesday, March 27, 12
    • ベンチマーク: 並列マッチング /([0-4]{5}[5-9]{5})*/, Input: 1GB [GB/sec] 6 Physical Cores 12 Virtual Cores 20 Fast 16.667 13.333 Throughput 10 6.667 3.333 Slow 0 1 2 3 4 5 6 7 8 9 10 11 12 Number of Threads コード生成無しSSFA コード生成有りSSFA 読み込みだけの指標プログラム •DFAの状態数は10, SFAの状態数は109. •コード生成版は物理コア数の台数効果(資源限界)Tuesday, March 27, 12
    • ベンチマーク:Matching micro-benchmark Parallel 並列化のオーバーヘッド Pattern: /(([02468][13579]){5})*/, Input: 100KB~1000KB Slow 2.40 msec 8,000K 7,200K Clock Cycle 1.92 msec 6,400K 5,600K 1.44 msec 4,800K 4,000K 0.96 msec 3,200K Fast 2,400K 1,600K 0.48 msec 800K 0K 100 200 300 400 500 600 700 800 900 1000 [KB] Input size コード生成無し Non-thread コード生成無し 2-thread コード生成有り Non-thread コード生成有り 2-thread •コード生成無し/有りで300KB/800KB程度で並列 マッチングが安定して上回る.Tuesday, March 27, 12
    • まとめ •効率の良い並列マッチングをオートマトンの自然 な拡張によって実現した. → SFA •マッチングにコード生成を用いることで3倍以上 の高速化. •実装は公開 → http://github.com/sinya8282/regenTuesday, March 27, 12
    • 課題 •「正規表現マッチング」の枠組みで高速化はもう やりきった? •高速な正規表現エンジンが活きるアプリケーショ ン/システムを考えていきたい. •SFAの状態数について分かっていない問題がいく つか....Tuesday, March 27, 12