C#用常量加速解析器?虽然抽象类

时间:2011-05-18 04:00:01

标签: c# regex parsing constants abstract-class

我有一系列解析器,它为相关数据解析相同的基本类型的文本,但它们来自各种来源,因此它们不同于subltey。我每天解析数百万个文档,因此任何速度优化都会有所帮助。

这是一个简单的例子来说明基本问题。设置解析器,以便有一个实际解析器实现的基本抽象解析器:

abstract class BaseParser
{
     protected abstract string SomeRegex { get; }

     public string ParseSomethingCool(string text)
     {
         return Regex.Match(text, SomeRegex).Value;
     }

     ....
 }

 class Parser1: BaseParser
 {
     protected override string SomeRegex { get { return "^.*"; } } // example regex

     ...
 }

 class Parser2: BaseParser
 {
     protected override string SomeRegex { get { return "^[0-9]+"; } } // example regex

     ...
 }

所以我的问题是:

  • 如果我要在get常量中返回返回的内容会加快速度吗?
  • 理论上如果它没有使用属性而且一切都是直线常数会加快速度吗?
  • 如果我能看到什么样的速度增加?
  • 我只是抓着稻草?

4 个答案:

答案 0 :(得分:2)

我不认为将属性转换为常量会给你带来明显的性能提升。 Jit'ed代码可能还有那些内联的(因为你输入了常量)。

我认为最好的方法是首先分析您的代码,看看哪些部分最有可能优化。我建议你看一下:

  1. RegEx - 正如您所知,有时,构建良好的RegEx表达式会说明快速和极慢之间的差异。它实际上是个案基础,取决于使用的表达方式和您提供的文本。
  2. 替代方案 - 我不确定您执行什么样的匹配,但是可能值得考虑其他方法,特别是如果您要匹配的内容并不复杂。然后对结果进行基准测试。
  3. 代码的其他部分 - 查看瓶颈出现的位置。它在磁盘IO或CPU中吗?查看是否有更多线程可以帮助或者重新访问读取文件内容的函数。
  4. 无论你最终做什么,它总是有助于衡量。确定有机会的区域,找到更快的方法,然后再次测量以验证它是否确实更快。

答案 1 :(得分:1)

get中的东西已经不变了。

我敢打赌,抖动已经在优化属性访问器,所以通过重构它们可能不会看到很多性能提升。

答案 2 :(得分:1)

我认为你不会从这种恐惧中看到明显的速度提升。不过,您最好的选择是尝试并对结果进行基准测试。

一个有所作为的改变是如果没有它就可以逃脱使用正则表达式。正则表达式是一个非常大而且有用的锤子,但并不是每个钉子都需要一把大锤子。

答案 3 :(得分:0)

从您显示的代码中不清楚为什么需要抽象类并继承 使用虚拟成员的速度较慢。此外,您的孩子课程没有密封。

你为什么不这样做:

public class Parser
{
    private Regex regex;

    public Parser(string someRegex)
    {
        regex = new Regex(someRegex, RegexOptions.Compiled);
    }

    public string ParseSomethingCool(string text)
    {
        return regex.Match(text).Value;
    }
}

或者像这样

public static class Parser
{
    public static string ParseSomethingCool(string text, string someRegex)
    {
        return Regex.Match(text, someRegex).Value;
    }
}

但是,我认为如果使用多线程,您将获得最大的性能提升。可能你已经这样做了。如果您不查看Task Parallel Library