哪个更快:Regex还是字符串操作?[关闭]

jmo0nnb3  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(108)

很难说清楚这里问的是什么。这个问题模棱两可、模糊、不完整、过于宽泛或修辞,无法以目前的形式合理回答。如果需要帮助澄清这个问题,以便重新讨论,请visit the help center
十年前就关门了。
什么时候我应该在字符串操作上使用Regex,反之亦然?

9cbw7uwe

9cbw7uwe1#

这取决于

虽然字符串操作通常会快一些,但实际性能在很大程度上取决于许多因素,包括:

  • 解析正则表达式多少次
  • 你的字符串代码写得多聪明啊
  • regex是否是预编译的

随着正则表达式变得越来越复杂,编写性能良好的等效字符串操作代码将花费更多的精力和复杂性。

o0lyfsai

o0lyfsai2#

字符串操作总是比正则表达式操作快,当然,除非你写的字符串操作效率很低。
正则表达式必须被解析,并生成代码以使用字符串操作来执行操作。正则表达式操作最多可以做最优的字符串操作。
使用正则表达式不是因为它们可以比普通字符串操作更快地完成任何操作,而是因为它可以用很少的代码完成非常复杂的操作,开销相当小。

igsr9ssn

igsr9ssn3#

我用两个函数FunctionOne(字符串操作)和FunctionTwo(正则表达式)做了一些基准测试。它们都应该得到'<'和''之间的所有匹配。

基准1:

  • 调用次数:1 '000'000
  • 输入:80个字符
  • 持续时间(字符串操作// FunctionOne):1.12秒
  • 持续时间(正则表达式操作//FunctionTwo):1.88秒
    基准2:
  • 调用次数:1 '000'000
  • 输入:2000字符
  • 持续时间(字符串操作):27.69秒
  • 持续时间(正则表达式操作):41.436秒
    结论:如果编程效率高的话,字符串操作几乎总是优于正则表达式。但是字符串操作越复杂,就越难在性能和维护方面跟上。
    Code FunctionOne
private void FunctionOne(string input) {
    var matches = new List<string>();
    var match = new StringBuilder();
    Boolean startRecording = false;
    foreach( char c in input) {
        if (c.Equals('<')) {
            startRecording = true;
            continue;
        }

        if (c.Equals('>')) {
            matches.Add(match.ToString());
            match = new StringBuilder();
            startRecording = false;
        }

        if (startRecording) {
            match.Append(c);
        }
    }
}

字符串

代码函数二

Regex regx = new Regex("<.*?>");
private void FunctionTwo(string input) {
    Match m = regx.Match(input);
    var results = new List<string>();
    while (m.Success) {
        results.Add(m.Value);
        m = m.NextMatch();
    }
}

4c8rllxm

4c8rllxm4#

前一段时间我用C#做了一些分析,比较了以下内容:
1)LINQ到对象。
2)Lambda表达式。
3)传统的迭代法。
所有这三种方法都在使用和不使用正则表达式的情况下进行了测试。在我的测试用例中得出的结论很清楚,在大量文本中搜索字符串时,正则表达式在所有这三种情况下都比非正则表达式慢得多。
你可以在我的博客上阅读详细信息:http://www.midniteblog.com/?p=72

相关问题