-1

我一直在编写一个程序来在 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());
    }

有很多嵌套循环,我知道这是问题所在。你有什么建议改进它?

4

1 回答 1

4

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

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

  • 使用 BackgroundWorker 完成工作
  • 卸载到单独的专用线程
  • 利用任务库
  • 直接使用线程池
  • 使用 Application.DoEvents更好,永远不要!.

(这些技术中的大多数超出了此答案的范围。)请参阅有关实现此技术的文章。

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

于 2013-08-05T23:50:53.677 回答