2017-05-29 8 views
0

私の移動プロジェクトでregexpの置き換えが非常に遅く、\ s +がregexp.ReplaceAllLiteralString(re2)を使用して1つのスペースに置き換えられていたことがわかりました。Regexp 1つ以上の対n + 1の一致

SVGの空白を崩壊させるためには、それは良いアイデアであるかどうかにかかわらず、 '{2、}'に変更すると操作が1/10になります。

\ s vs ''を使用している間はかなり差がありますが、それは意味があり、比較結果は5倍です。しかし、なぜ1つのスペースと+を使用すると、{2、}よりも9倍遅くなるのですか?

答えて

0

X+は、「1回以上発生するXのすべてのインスタンス」を意味します。つまり、{1,}に相当します。 \s+を使用する場合は、(1つの空白)と     を置き換えます。

\s+を使用しているSVGドキュメントまたは任意のXMLドキュメントでは、処理が遅くなることがあります。以下の文書は5つの置き換え、改行シーケンスを無視して必要になります。

<?xml version="1.0" encoding="utf-8"?> 
<element attr1="value" attr2="value" attr3="value"/> 

を今よりもずっと複雑であるSVG文書を想像し、それは\s{2,}のようなものが\s+(別称、\s{1,})よりもはるかに高速になると合理的です! \s{2,}を使用した場合、上記のドキュメントには0個の置換があります。

+0

これは、置き換えが比較よりもコストがかかりますか? \ s {2、}の比較は、パターンに基づいて1ではなく2バイト/ルーンを消費しない限り、\ s {1、}よりもコストが高いように見えます。 – jpj

+0

@jpjこれは、置き換えるテキストによって異なります。 XMLの場合、 '\ s {1、}'はほとんど常に何かを見つけて置き換え、結果として致命的なパフォーマンスを招く可能性があります。 '\ s {2、}'は置き換えられるものが見つかるかもしれないし、見つからないかもしれないので、置き換えではなく時間の比較の大部分が主な要因になるので、パフォーマンスにあまり影響を与えません。 –

関連する問題