【问题标题】:What's the most efficient way to access the value of a match?访问匹配值的最有效方法是什么?
【发布时间】:2013-05-03 17:13:13
【问题描述】:

在 C# 中有很多方法可以访问 Match 的值:

Match mtch = //whatever
//you could do
mtch.Value
//or 
mtch.ToString()
//or
mtch.Groups[0].Value
//or 
mtch.Groups[0].ToString()

我的问题是:访问它的最佳方式是什么?

(我知道这是微优化,我只是想知道)

【问题讨论】:

  • 嗯,这似乎很容易让您使用您真正感兴趣的正则表达式中的适当样本数据来测试自己。这些测试进展如何?
  • 测试如下:Match.ToString(): 13823982 Match.Value: 11846245 Match.Groups[0].Value: 22549607 Match.Groups[0].ToString(): 22549607(滴答声)。为什么我很感兴趣的是为什么 Value 和 ToString 完全相同,因为这一定意味着它们中必须有完全相同的代码。

标签: c# regex match


【解决方案1】:

我写了一个快速测试,结果如下...

    [TestMethod]
    public void GenericTest()
    {
        Regex r = new Regex(".def.");
        Match mtch = r.Match("abcdefghijklmnopqrstuvwxyz", 0);
        for (int i = 0; i < 1000000; i++)
        {
            string a = mtch.Value;                  // 15.4%
            string b = mtch.ToString();             // 19.2%
            string c = mtch.Groups[0].Value;        // 23.1%
            string d = mtch.Groups[0].ToString();   // 38.5%
        }
    }

【讨论】:

  • 谢谢!另外,你是怎么得到时间分配的?只是想知道。
  • Visual Studio 2012 性能分析器(函数详细信息 -> 包含样本 %)——我运行得越多,得到的结果差异就越大。但是,似乎进入“组”数组的速度较慢。有时 Value 和 ToString() 最终会完全匹配。有时 Value 会超过 .ToString()。但总的来说,数组始终较慢,而 .ToString() 通常也较慢。
  • 我想知道为什么你的测试与我的测试不接近 :) 我猜你的 string afor 中会导致这个错误,但字符串是不可变的,所以它不应该有那么大的区别
  • 当我运行您的测试 WhileTrueSleep 时,我得到 16.2%、20.3%、28.6% 和 30.4%。 (当然我很不耐烦,大约 30 秒后结束了测试)我不知道为什么你的第一个这么快!
【解决方案2】:

如果您根据您提供的样本谈论效率,我猜最有效的将是第一个,因为当您使用 ToSting() 时,它会为您的变量添加额外的转换功能,这将花费额外的时间,

【讨论】:

  • 实际上,Match.ToString() 正在返回 this.Value(您可以使用 ILSpy 或 Reflector 等程序集反编译器检查它),因此它只是更慢,因为它需要额外的方法调用。
【解决方案3】:
  1. 写一个测试
  2. 读取结果
  3. 考虑结果

如果您不想编写测试,请查看 Microsoft 中间语言 (MSIL) 并考虑需要更多时间


我也测试了结果

            // VS 2012 Ultimate
            // 
            Regex r = new Regex(".def.");
            Match mtch = r.Match("abcdefghijklmnopqrstuvwxyz", 0);
            string a, b, c, d;
            for (int i = 0; i < int.MaxValue; i++)
            {
               a = mtch.Value;                  // 1.4%
               b = mtch.ToString();             // 33.2%
               c = mtch.Groups[0].Value;        // 15.3%
               d = mtch.Groups[0].ToString();   // 44.1%
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 2011-06-05
    • 2018-07-16
    • 2014-09-24
    • 2019-06-30
    • 2011-07-17
    • 1970-01-01
    相关资源
    最近更新 更多