private static void BuildDictionaryOfRequires(Regex exp, Dictionary<string, string> dictionary, DirectoryInfo dir)
{
var i = 0;
var total = dir.EnumerateFiles("*.*", SearchOption.AllDirectories).
Where(x => x.Extension == ".aspx" || x.Extension == ".ascx").Count();
foreach (var item in dir.EnumerateFiles("*.*", SearchOption.AllDirectories).
Where(x => x.Extension == ".aspx" || x.Extension == ".ascx"))
{
#if DEBUG
Stopwatch sw = Stopwatch.StartNew();
#endif
var text = File.ReadAllText(item.FullName);
MatchCollection matches = exp.Matches(text);
foreach (Match match in matches)
{
var matchValue = match.Groups[0].Value;
if (dictionary.ContainsKey(matchValue))
{
dictionary[matchValue] = string.Format("{0},{1}", dictionary[matchValue], item.Name);
}
else
{
dictionary.Add(matchValue, item.Name);
}
}
Console.WriteLine(string.Format("Found matches in {0}.", item.Name));
#if DEBUG
sw.Stop();
Console.WriteLine("Time used (float): {0} ms", sw.Elapsed.TotalMilliseconds);
#endif
Console.WriteLine(string.Format("{0} of {1}", (++i).ToString(), total));
}
}
lambda找到大约232个文件。它通过160撕裂就好了然后爬行。我正在分析代码,但想知道是否有什么明显的我做错了。用于解析文件内文本的代码减速停止c#
的正则表达式是
Regex exp = new Regex(@"dojo\.require\([""'][\w\.]+['""]\);?", RegexOptions.IgnoreCase | RegexOptions.Compiled);
所有文件的相似长度和类似的结构。
大多数文件需要少于30毫秒,但有些是11251毫秒。
更新正则表达式整个过程现在需要1700ms。唷!
Close和Dispose不等价,通常Dispose也调用close,就像SqlConnection一样,但这并不意味着它们是等价的,因为Close永不处理(或者至少通常不会)。 –
@Davide我注意到perf命中后添加了那些乐趣。由于使用声明,我可能会删除这些行。我将不得不检查文件vcsjones,看看我能否注意到一些事情。 – Steve
@Davide:从StreamReader.Close上的MSDN:“Close的这个实现调用Dispose方法传递一个真实值。” – Joe