2016-04-17 9 views
-6

こんにちは、これは私の文字列であるPCREを使用します。増加ブースト正規表現速度やC++で

key{info('1'),details('1'),others('{"1": "2test data1", "2": "2test data2"}')} 

私はこのライン以上の1 milionを作り、(同じ)などのファイルに入れ

key{info('1'),details('1'),others('{"1": "2test data1", "2": "2test data2"}')} 
key{info('1'),details('1'),others('{"1": "2test data1", "2": "2test data2"}')} 
key{info('1'),details('1'),others('{"1": "2test data1", "2": "2test data2"}')} 
key{info('1'),details('1'),others('{"1": "2test data1", "2": "2test data2"}')} 
key{info('1'),details('1'),others('{"1": "2test data1", "2": "2test data2"}')} 
.. 
.. 
.. 

今、私は正規表現

key[{]info[(][']1['][)],details[(][']1['][)],others[(]['][{](.*?)[}]['][)][}] 

(内部の各ライン(その他)を取得)

0123を使用したいです

私はpreg_match_all機能とPHPでそれをテストし、私はPHPがちょうど3秒に1つのmilionラインのすべてを検出しますが、私の本当のプログラムはC++であるので、私はC++

regex RegexString(R"~(key[{]info[(][']1['][)],details[(][']1['][)],others[(]['][{](.*?)[}]['][)][}])~", regex_constants::optimize); 
に、この正規表現をしようとしたことを驚いています

と私は驚いたが、今回は悪かった。 10 Min正規表現は、すべての行を得た後

私は、今...ブーストを使用して、より良い結果(2分)を得たが、私はPHP(PCRE)(3秒)で見たことは私が狂っ製(検出)するもの私はする必要がありますか?

Boostや標準のC++正規表現では、スピードを上げる方法(3〜10秒で完了)はありますか、C++プロジェクトでPCREだけ使用する必要がありますか?

結果

正規表現:10分
ブースト:2分
PCRE(PHP):regex101.comによると、3秒

+0

いくつかの説明: - http://stackoverflow.com/questions/33163365/regex-works-very-slow http://stackoverflow.com/questions/14205096/ c11-regex-pythonより遅い – rock321987

+0

助けられません!私はちょうど私が最適化を最適化することができるかどうかを知りたい場合は最高の最適化は何かを教えてくださいまたは速度を向上させる方法がない場合は私はpcreを使用します – Elh48

+0

あなたは時間差が正規表現の結果であると確信しています何か?ループ内の正規表現をコンパイルしていますか? – Laurel

答えて

0

を、それが5行に対してあなたの正規表現にマッチする610個の手順を実行します。それは多いです。

(.*?)([^}]*)に変更すると、230ステップかかります。これにより、時間が5分未満に短縮されるはずです。

式に}があると、([^}]*)が一致しない場合は、代わりに((?:[^}]*}??)*?)を試してください。それは25-40のステップを追加しますが、あなたのオリジナルと同じくらい遅くないかもしれません。

式全体でキャプチャグループを削除すると、10ステップを削減できます。あなたはそれを必要としません、$0は同等です。

あなたが理解する必要があることは、C++がPCREとは異なる正規表現エンジンを使用していることです。 PCREは非常に高度であり、おそらくより多くの最適化が含まれています。

データに含まれるものが何であるかを理解していないと、最適化できるものがわからないことがあります。


もう1つのことは、正規表現で行われた作業の一部をC++に移行することです。

たとえば、key{info('のすべてのインスタンスを見つけて、正規表現の先頭からkey[{]info[(][']を削除してみてください。その後、各key{info('が発生した直後に一致するかどうかを調べることができます。

}')}のすべてを、その行のどこにも決して出現しない文字で置き換えて、(.*?)[}]['][)][}]の代わりに([^c]*)を使用してください。

+0

私は内部ですべてを取得する必要があります([^}] *)は私のために制限を行います.. – Elh48

+0

@ Elh48あなたのデータは '$'の中に '}'を含んでいますか?答えがノーならば、これを加えても正規表現は壊れません。 – Laurel

+0

はい含まれる可能性があります}}私はすべてのスターターを使用することはできません..私は行があり、..私はすべてを取得する必要があります.. PHPで3秒でこの正規表現の仕事!なぜ私はC++で2〜3分待たなければならないのか分からない!!!!!!! – Elh48

2

i used the boost and got better result (2 Min)

あなたはそれはそれを信じるように私を見る必要があるだろう!

ブーストを使用するこのアプリケーションRegexFormatのベンチマークソフトウェアを使用して、私は3秒未満です。

benchmark softwareのものは、単一のテストライン
を使用して、それを100万回実行し、それを一度実行する100万行と同じにすることができます。

ここに結果があります。あなた自身で試してみることができます。
基本的には、ボード全体で2.5秒で実行されます。

2つの正規表現がテストされます.1つは余分なキャプチャグループを持ち、もう1つは
であり、上記の2つのregexesテキストを表します。

ターゲットライン:

key{info('1'),details('1'),others('{"1": "2test data1", "2": "2test data2"}')} 

1ラインの実行1,000,000回:

Regex1: key[{]info[(][']1['][)],details[(][']1['][)],others[(]['][{](.*?)[}]['][)][}] 
Options: <none> 
Completed iterations: 1/1  (x 1000) 
Matches found per iteration: 1000 
Elapsed Time: 2.38 s, 2381.16 ms, 2381163 µs 


Regex2: (key[{]info[(][']1['][)],details[(][']1['][)],others[(]['][{](.*?)[}]['][)][}]) 
Options: <none> 
Completed iterations: 1/1  (x 1000) 
Matches found per iteration: 1000 
Elapsed Time: 2.50 s, 2495.65 ms, 2495649 µs 

万:

Regex1: key[{]info[(][']1['][)],details[(][']1['][)],others[(]['][{](.*?)[}]['][)][}] 
Options: <none> 
Completed iterations: 1000/1000  (x 1000) 
Matches found per iteration: 1 
Elapsed Time: 2.78 s, 2777.70 ms, 2777696 µs 


Regex2: (key[{]info[(][']1['][)],details[(][']1['][)],others[(]['][{](.*?)[}]['][)][}]) 
Options: <none> 
Completed iterations: 1000/1000  (x 1000) 
Matches found per iteration: 1 
Elapsed Time: 2.89 s, 2893.58 ms, 2893576 µs 

千行が1000回実行

Regex1: key[{]info[(][']1['][)],details[(][']1['][)],others[(]['][{](.*?)[}]['][)][}] 
Options: <none> 
Completed iterations: 100/100  (x 1) 
Matches found per iteration: 10000 
Elapsed Time: 2.38 s, 2384.73 ms, 2384729 µs 


Regex2: (key[{]info[(][']1['][)],details[(][']1['][)],others[(]['][{](.*?)[}]['][)][}]) 
Options: <none> 
Completed iterations: 100/100  (x 1) 
Matches found per iteration: 10000 
Elapsed Time: 2.50 s, 2497.35 ms, 2497349 µs 

最後に、船外実験:行は100回を実行します。 1つのラインの実行9999000回:

Regex1: key[{]info[(][']1['][)],details[(][']1['][)],others[(]['][{](.*?)[}]['][)][}] 
Options: <none> 
Completed iterations: 9999/9999  (x 1000) 
Matches found per iteration: 1 
Elapsed Time: 27.54 s, 27536.56 ms, 27536560 µs 


Regex2: (key[{]info[(][']1['][)],details[(][']1['][)],others[(]['][{](.*?)[}]['][)][}]) 
Options: <none> 
Completed iterations: 9999/9999  (x 1000) 
Matches found per iteration: 1 
Elapsed Time: 28.73 s, 28726.18 ms, 28726182 µs 
+0

10,000行が100回実行されます。なぜ私のプログラムでは5分!!!!!!!!!ですか? – Elh48

+0

@ Elh48 - あなたの正規表現を使ってあなたのラインにマッチするboost :: regexベンチマークは、100万回、2秒かかって、あなたの顔を真っ直ぐ見つめています。私はあなたが何をしているのか分からないと思っています。 – sln

+0

@ Elh48ハラスメント「!!!!!!! ?????」を停止します。何度も尋ねられた後、コードを表示できませんでした。あなたはいつも不信心に叫ぶ。あなたが助けたいと思わない結論に達しました。あなたはトロールです。 – sehe