c# - 解析文件中文本的代码减慢到停止 c#

标签 c# regex file-io profiling

 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,然后爬行。我现在正在分析代码,但想知道是否有明显的错误。

正则表达式是

    Regex exp = new Regex(@"dojo\.require\([""'][\w\.]+['""]\);?", RegexOptions.IgnoreCase | RegexOptions.Compiled);

所有文件的长度和结构都相似。

大多数文件耗时不到 30 毫秒,但有些文件耗时 11251 毫秒。

使用更新的正则表达式,整个过程现在需要 1700 毫秒。呸!

最佳答案

尝试简化您的正则表达式:

Regex exp = new Regex(@"dojo\.require\([""'][\w\.]+[""']\)", RegexOptions.IgnoreCase | RegexOptions.Compiled);

更新:如果您想匹配您的示例,请删除末尾的分号。

关于c# - 解析文件中文本的代码减慢到停止 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7493117/

相关文章:

c# - 采用无效代码路径时抛出哪个异常?

C# 使用 JSON.Net 解析 JSON 数字属性

java - 按主要词分组

c# - 如何在 Windows 10 C# 通用应用程序中使用 C++ 类?

c# - wpf 中的屏幕事件

java - 使用一个元组流中的字段作为第二个元组流上 RegexParser 中正则表达式的一部分

python - 在键值列表正则表达式中屏蔽密码

javascript - 对于文件夹输入,Reactjs 不接受 "webkitdirectory directory"作为输入的属性

powershell - 将控制台输出写入文件 - 文件意外为空

c - 从二进制文件 C 中写入和读取结构