此程序需要很长时间才能终止.我该如何优化它
本文关键字:何优化 优化 终止 程序 长时间 | 更新日期: 2023-09-27 18:26:28
我一直在编写一个程序,在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());
}
有很多嵌套循环,我知道这就是问题所在。你建议如何改进它?
假设你要重写代码以提高性能,那么你所做的工作仍然有可能是CPU限制的,因此,如果它的产量不够,以至于主线程无法处理与UI相关的事件处理,那么你的应用程序中总是会出现所谓的冻结。
有几种技术可以应对这种情况:
- 使用BackgroundWorker完成工作
- 卸载到单独的专用线程
- 利用任务库
- 直接使用线程池
-
使用Application.DoEvents更好,永远不要
(这些技术中的大多数都超出了这个答案的范围。)请参阅本文中关于实现此技术的内容。
核心思想是,如果你有CPU或IO绑定的工作,而你的UI主线程没有足够的时间进行事件处理,这将是一个无法避免的问题。