什么更快:正则表达式或字符串操作?

Fab*_*ler 12 c# regex string performance

什么时候我应该使用Regex而不是字符串操作,反之亦然只考虑性能?

SLa*_*aks 19

这取决于

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

  • 你解析正则表达式的次数
  • 你编写字符串代码有多聪明
  • 正则表达式是否已预编译

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


Guf*_*ffa 8

字符串操作将始终比正则表达式操作快。当然,除非您以低效的方式编写字符串操作。

必须解析正则表达式,并生成代码以使用字符串操作执行该操作。充其量,正则表达式操作可以执行最佳的字符串操作。

不使用正则表达式是因为它们可以比纯字符串操作更快地执行操作,而使用正则表达式是因为它可以用很少的代码来完成非常复杂的操作,并且开销也相当小。


Fab*_*ler 6

我用两个函数做了一些基准测试,这两个函数叫做FunctionOne(字符串操作)和FunctionTwo(Regex).他们应该得到'<'和'>'之间的所有匹配.

基准#1:

  • 被称为:1000'000
  • 输入:80个字符
  • duration(字符串操作// FunctionOne):1.12秒
  • 持续时间(正则表达式操作// FunctionTwo):1.88秒

基准#2:

  • 被称为:1000'000
  • 输入:2000个字符
  • 持续时间(字符串操作):27.69秒
  • 持续时间(正则表达式操作):41.436秒

结论:如果有效编程,字符串操作几乎总是会超过正则表达式.但是它越复杂,字符串操作就越难以保持性能问题,而且还要保持维护.

代码功能1

  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);
            }
        }
        }
Run Code Online (Sandbox Code Playgroud)

代码功能2

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 实际的答案是,它在很大程度上取决于你在做什么,如何做以及经常做什么 (8认同)
  • 你的正则表达式基准是非常错误的; 你每次都在重新编译正则表达式.如果重用单个实例,它将变得更快.如果你通过`RegexOptions.Compiled`,它会变得更快. (7认同)