我有一个应用程序,作为其功能的一部分,检查数千条文本对正则表达式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行代码。对不起,如果我的格式和内容很乱,我不太擅长。