我编写了一个简单的测试应用程序来检查是否可以根据需要使用正则表达式。我需要在提供的文本文件中查找所有重复的标签并将其替换为一些唯一的字符串。例如,如果在输入文件中找到的某些文本多于一次,则所有出现的文本都应替换为 {1},依此类推。
为此,我创建了以下代码段:
static void Main(string[] args)
{
StringBuilder xml = new StringBuilder(File.ReadAllText(@"C:\Integration\Item-26 - Copy.xml"));
Regex r = new Regex(
@"(?<exp>\<(?<tag>[^\<\>\s]+)[^\<\>]*\>[^\<\>]+\<\/\k<tag>\>).*\k<exp>",
RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.CultureInvariant);
List<string> values = new List<string>();
MatchCollection matches = r.Matches(xml.ToString());
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (matches.Count > 0)
{
foreach (Match m in matches)
{
string matchValue = m.Groups["exp"].Value;
values.Add(matchValue);
xml.Replace(matchValue, string.Concat("{" + (values.Count - 1) + "}"));
}
Console.WriteLine("Analyzed " + matches.Count + " matches, total replacements = " + values.Count);
matches = r.Matches(xml.ToString());
}
stopwatch.Stop();
Console.WriteLine("=============== " + stopwatch.Elapsed.TotalSeconds);
Console.ReadLine();
}
问题是如果我有一个大文件作为输入(> 1MB),那么每次查找匹配项的调用时间都比以前长。一开始调用matches.Count需要0.3秒。而在 100 次迭代之后,将需要超过 1 分钟。
我已经检查了测试应用程序的内存使用情况——它几乎没有消耗任何东西,没有任何真正的增长。
是什么原因造成的,我怎样才能获得稳定的性能?提前致谢。