3

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

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

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

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

所以底线:7 场不同的比赛对阵 1 场比赛和一场分裂。

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

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

4

2 回答 2

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

测试代码如下。它使用了我编写的一个小基准测试实用程序,可以从结果中消除时序测试开销(括号循环等)。我不是正则表达式专家,所以希望我的搜索模式可以与字符串测试相媲美。

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); });
于 2013-05-02T16:42:53.150 回答
0

我得到了 24783 个入口文件来测试结果。

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

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

也许是因为我首先运行的正则表达式涵盖了大部分内容(如前所述,它使用了 91.3% 的案例),捣碎的正则表达式确实表现得很好。

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

在 24k 样本上结束测试 - 大约 0.05 秒的差异。

于 2013-05-07T15:02:30.783 回答