-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 に答える