c# - 正则表达式操作成本

标签 c# regex performance

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

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

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

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

所以底线:7 场不同的比赛对 1 场比赛和一个 split 。

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

我想保持这个问题的时间性,但是对于建议和决策,第一次匹配后字符串被接受的概率大约是 91.3%

最佳答案

我不是很清楚您的搜索条件是什么。您暗示匹配字符串总是在末尾。所以这里有一些简单的时间测试来给出一个大概的概念。测试搜索两个字符串,第一个不存在于目标中,第二个存在。

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); });

关于c# - 正则表达式操作成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16325460/

相关文章:

c - 从 stdin 读取的程序比从文件读取的效率如何?

c# - if else 或 switch 的当前 CultureName?

c# - 模拟 Controller 上下文 asp 4.5

c# - 用于验证逻辑 && || 的正则表达式字符串中的运算符

javascript - 从字符串中删除多余的 <br>

python - 为 20,000 多个更新优化 Sqlite3

c# - Windows 手机 8 : Alternating colors on a ItemsControl

c# - 滚动到列表框 wp7 的底部

java - 在值之间用逗号分割字符串,并忽略值内的逗号

performance - 如何在 PyQt 中调整小部件大小时禁用多次自动重绘?