正则表达式运营成本

时间:2013-05-01 19:57:03

标签: c# regex performance

所以底线,速度真的对我很重要。每毫秒,所以我想看看哪种方法最快。

我是我的程序,我有各种不同的标志(flag [1] - flag [7])。要了解如何处理输出,我必须将输入与各种模式之一匹配(模式[1] - 模式[7])。所以这里是问题,它是否更好地匹配模式[1]的字符串,如果它匹配,处理它,如果不尝试匹配模式[2](几乎做匹配7次)或放置所有模式分成一个正则表达式,如:

"^[patterns[1]|pattern[2]|...]$

查看是否匹配,如果匹配,则对字符串进行拆分以获取标志值(它总是在最后)并相应地处理它?<​​/ p>

所以底线:针对1场比赛和分区的7场不同比赛。

注意:根据提供的数据,我将尝试对7个匹配进行排序,因此最有可能匹配的匹配将首先进行匹配。

我想让这个问题以时间为导向,但是对于建议和决策,首次匹配后接受字符串的概率大约为91.3%

2 个答案:

答案 0 :(得分:2)

我并不完全清楚您的搜索条件是什么。您提示匹配字符串始终位于末尾。所以这里有一些简单的时间测试来给出一个大致的想法。测试搜索两个字符串,第一个字符串不存在于目标中,第二个字符串存在。

string.IndexOf 240 nanoseconds (to find string anywere in string, not just at end)
string.EndsWith 210 nanoseconds
Regex.Match 1,285 nanoseconds
precompiled Regex 648 nanoseconds

测试代码如下。它使用了一点benchmarking utility我写的,从结果中删除了定时测试开销(包围循环等)。我不是正则表达式专家,所以希望我的搜索模式与字符串测试相当。

string s = "zzzzzzzzzzzzzzzzzzzzzzzsomething";
string search1 = "thinker";
string search2 = "something";
int pos = 0;
new Bench().Time("string.IndexOf", (c) => {
    for (int i = 0; i < c; i++) {
        if ((pos = s.IndexOf(search1)) < 0) {
            pos = s.IndexOf(search2);
        }
    }
});
bool found = false;
new Bench().Time("string.EndsWith", (c) => {
    for (int i = 0; i < c; i++) {
        if (!(found = s.EndsWith(search1))) {
            found = s.EndsWith(search2);
        }
    }
});
string pattern = "(" + search1 + "|" + search2 + ")$";
Match match = null;
new Bench().Time("Regex.Match", (c) => { for (int i = 0; i < c; i++) match = Regex.Match(s, pattern); });
Regex regex = new Regex(pattern, RegexOptions.Compiled);
new Bench().Time("precompiled", (c) => { for (int i = 0; i < c; i++) match = regex.Match(s); });

答案 1 :(得分:0)

我收到24783条目来测试结果。

当使用7个不同的正则表达式时,我运行它并在第一次运行时得到0.1932秒,对于所有连续运行得到0.14-0.16(正则表达式编译时间)。

当仅使用1个正则表达式(将所有7个正则表达式拼成1个)时,第一次编译时得到0.262,连续运行时得到0.18-0.21。

也许是因为我首先运行的正则表达式覆盖了大部分(如前所述,它使用了91.3%的情况),捣碎的正则表达式确实表现得相当不错。

我做了额外的操作,发现我之后仍然需要拆分字符串以进行处理,所以在if-else语句和1个巨大的正则表达式中,所有这些都归结为7个正则表达式。

对24k样品进行最终测试 - 差异大约为0.05秒。