C#Regex对象编译与DLL速度

时间:2016-04-11 14:10:21

标签: c# regex

我有一个应用程序,作为其功能的一部分,检查数千条文本对正则表达式IsMatch,然后是另一个匹配。我想,因为我使用大约20个正则表达式来检查成千上万的东西,我会把它们放在.dll预编译中,这会更快。但是,在基准测试之后,看起来在代码中编译它们所需的时间比使用.dll要少一些。差异很小(大约5.4秒vs 5.2秒)。我使用PowerShell Measure-Command多次为每个解决方案计时并对它们进行平均,因此应该包含编译时间。

对象仅在循环之前的任何一种方式创建。我还将正则表达式缓存设置为略高于我正在使用的数字(如果我只创建一次对象,我不清楚这是否重要,我猜不是)。

这是.exe代码的两个版本。显然两个版本都不会同时编译,使用你的想象力。

    LimitHiPattern rgx_limithi = new LimitHiPattern();
    Regex rgx_limithi = new Regex(@"LIMIT_HI", RegexOptions.IgnoreCase | RegexOptions.Compiled);

    foreach (CSVline line in input_data)
    {
        if (rgx_limithi.IsMatch(line.Cat))
             //a regex match extract here with a different regex....
    }

DLL代码看起来像这样。

     RegexCompilationInfo LimitHiPattern = new RegexCompilationInfo(@"LIMIT_HI", RegexOptions.IgnoreCase, "LimitHiPattern", "Utilities.RegularExpressions", true);
     RegexCompilationInfo[] regexes = { LimitHiPattern };
     AssemblyName assemName = new AssemblyName("RegexLib, Version=1.0, Culture=neutral, PublicKeyToken=null");
     Regex.CompileToAssembly(regexes, assemName);

显然还有其他正则表达式,我只给了一个。

我知道区别很小。但即使我针对数据子集运行它,因此编译时间应该是一个更重要的块,总体执行速度要快得多,但是不能更快地执行.dll(0.62对0.61秒)。

这只是在.dll文件中查找对象而不是保留在我自己的exe代码中的代价吗?总的来说,这在我的计划方案中并不重要,我只是喜欢理解事物。

修改

一些(稍微)更完整的代码,也许我正在做一些非常愚蠢的事情导致这种情况(可能!)。我已经重新测试,目前dll版本(预编译)是4.72秒,编译版本是3.05秒,相当不同。这是使用powershell中的发布版本和measure-command定时的。

using Utilities.RegularExpressions; //in custom RegexLib.dll
class Program
{

    static void Main(string[] args)
    {
         TextCounter(dicText, input_data);
    }

    private static void TextCounter(Dictionary<string, AudAll> dic, List<CSVline> input_data)
    {
          Regex rgx_limithi = new Regex(@"LIMIT_HI", RegexOptions.Compiled);
          //LimitHiPattern rgx_limithi = new LimitHiPattern();
            foreach (CSVline line in input_data)
            {
                AudAll currentCount;
                Match match;
                string smatch;

                if (rgx_limithi.IsMatch(line.Cat))
                {
                    smatch = rgx_limitdmsx.Match(line.Text).Groups[1].Value;
                    if (dic.TryGetValue(smatch, out currentCount))
                    {
                        currentCount.Increment(line.Audible);
                    }
                    else
                    {
                        currentCount = new AudAll();
                        currentCount.Increment(line.Audible);
                        dic.Add(smatch, currentCount);
                    }
                }
            }

显然有些东西没有声明,类没有创建和东西,我试图不要输入500行代码。对不起,如果我的格式和内容很乱,我不太擅长。

0 个答案:

没有答案