我有一系列解析器,它为相关数据解析相同的基本类型的文本,但它们来自各种来源,因此它们不同于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
...
}
所以我的问题是:
答案 0 :(得分:2)
我不认为将属性转换为常量会给你带来明显的性能提升。 Jit'ed代码可能还有那些内联的(因为你输入了常量)。
我认为最好的方法是首先分析您的代码,看看哪些部分最有可能优化。我建议你看一下:
无论你最终做什么,它总是有助于衡量。确定有机会的区域,找到更快的方法,然后再次测量以验证它是否确实更快。
答案 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