C# 此程序需要很长时间才能终止。我如何优化它?

C# 此程序需要很长时间才能终止。我如何优化它?,c#,optimization,C#,Optimization,我一直在编写一个程序,在XML和文本文件中执行一种模式匹配。当我的程序到达代码的这一部分时,CPU的使用率会非常高,性能会下降到程序看起来冻结的程度,但实际上并非如此。根据输入(文本文件及其内容的数量),完成任务可能需要几个小时。我正在寻找一种更有效的方法来重写这段代码: List<string> CandidatesRet = new List<string>(); for (int indexCi = 0; indexCi < Ci.Count - 1; in

我一直在编写一个程序,在XML和文本文件中执行一种模式匹配。当我的程序到达代码的这一部分时,CPU的使用率会非常高,性能会下降到程序看起来冻结的程度,但实际上并非如此。根据输入(文本文件及其内容的数量),完成任务可能需要几个小时。我正在寻找一种更有效的方法来重写这段代码:

List<string> CandidatesRet = new List<string>();

for (int indexCi = 0; indexCi < Ci.Count - 1; indexCi++)
{
    // generate all sub itemset with length-1
    string[] allItems = Ci[indexCi].Split(new char[] { ' ' });
    for (int i = 0; i < allItems.Length; i++)
    {
        string tempStr = "";
        for (int j = 0; j < allItems.Length; j++)
            if (i != j)
                tempStr += allItems[j] + " ";
        tempStr = tempStr.Trim();
        subItemset.Add(tempStr);
    }

    // THE PROBLEM BEGINS HERE 

    foreach (string subitem in subItemset)
    {
        int iFirtS;
        for (int indexCommon = indexCi + 1; indexCommon < Ci.Count; indexCommon++)
            if ((iFirtS = Ci[indexCommon].IndexOf(subitem)) >= 0)
            {
                string[] listTempCi = Ci[indexCommon].Split(new char[] { ' ' });
                foreach (string itemCi in listTempCi)
                    if (!subitem.Contains(itemCi))
                        commonItem.Add(itemCi);
            }
        allCommonItems.Add(commonItem);
    }

    // generate condidate from common item
    foreach (string item in oldItemsetCi)
    {
        bool flagCi = true;
        foreach (List<string> listCommItem in allCommonItems)
            if (!listCommItem.Contains(item))
            {
                flagCi = false;
                break;
            }
        if (flagCi)
            CandidatesRet.Add((Ci[indexCi] + " " + item).Trim());
    }
List CandidatesRet=new List();
对于(int indexCi=0;indexCi=0)
{
字符串[]listTempCi=Ci[indexCommon]。拆分(新字符[]{''});
foreach(listTempCi中的字符串itemCi)
如果(!subitem.Contains(itemCi))
commonItem.Add(itemCi);
}
添加(commonItem);
}
//从公共项生成条件
foreach(oldItemsetCi中的字符串项)
{
bool-flagCi=true;
foreach(列出所有CommonItems中的listCommItem)
如果(!listCommItem.Contains(item))
{
flagCi=false;
打破
}
if(flagCi)
CandidatesRet.Add((Ci[indexCi]+“”+item.Trim());
}

有许多嵌套循环,我知道这就是问题所在。您建议如何改进它?

假设您要重新编写代码以提高性能,那么您所做的工作仍有可能受到CPU的限制,因此如果它不能产生足够的产量,以便主线程能够处理与UI相关的事件处理,您将在应用程序中会遇到所谓的冻结

有几种技术可以解决这一问题:

  • 请一位幕后工作人员来完成这项工作
  • 卸载到单独的专用线程
  • 利用任务库
  • 直接利用线程池
  • 使用Application.DoEvents更好,永远不要!
(这些技术中的大多数都超出了本答案的范围)请参阅上的这篇文章


其核心思想是,如果您有CPU或IO绑定的工作,而您的UI主线程没有足够的时间进行事件处理,这将是一个无法避免的问题。

这个问题更适合。您正在解析的文本文件有多大?此外,您是否考虑过使用i是否要节省内存?@Tombatron:文件不大,但例如10个100kb的文件需要1个多小时才能处理。快速检查后,我发现一个问题。所有CommonItems都在循环中,并且没有初始化,因此它会随着处理更多数据而增长。与commonItem相同。我假设它们是列表或列表。这就是为什么您必须这样做的原因使用loop loop检查.Contains(),速度很慢。使用字典保存所有commonItem,速度会快得多。另外,由于代码非常简单,实在说不出更多。@杰克,你做过代码分析吗?不要撒上“Application.DoEvents”如果没有Application.DoEvents,您的所有方法都将彼此以原子方式运行。使用Application.DoEvents,任何事情都可能发生。如果您确实需要在后台线程上运行某些东西,请在t上运行它他打开后台线程,然后使用一个常见的异步模式抽象出这个事实大胆和更大font@KenWhite我修改了答案。我知道DoEvents是一种难看的解决方法,但我不知道它会给应用程序带来哪些重入问题。我认为对于最简单的情况来说,这很好,但我宁愿修改答案,因为你很好,不会投反对票。我们都有一些东西需要学习rn on stackoverflow.+1.好多了。:-)我将删除以前的评论以清理混乱。