2012-01-16 12 views
7

私のWebアプリケーションがパフォーマンスに優れていることを確認し、パフォーマンス上の問題を起こさないようにします。私が検索したとき、パフォーマンスの問題に関連する最も一般的な問題の1つが「無限ループ」問題であることがわかりました。無限ループを検出して回避するにはどうすればよいですか?

私が聞いてみたい:私は私のコードは無限ループが発生したことがないことを確認するために開始する必要があります

を?

記事、アドバイス、説明、例はありますか?私は感謝するでしょう。

例:

このコードは無限ループを引き起こすことがありますか?事前に

public static IEnumerable<SubjectNode> ReadSubjectNodes(string filePath) 
{ 
    using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
    using (XmlReader xrdr = new XmlTextReader(fs)) 
     while (xrdr.Read()) 
      if (xrdr.NodeType == XmlNodeType.Element && xrdr.LocalName == "subject") 
       yield return new SubjectNode(xrdr.GetAttribute("id"), xrdr.GetAttribute("name"), xrdr.GetAttribute("short")); 
} 

おかげ

+1

巨大な上限、つまり 'int ReadCount = 100000; while(xrdr.Read()&ReadCount--> 0) ' –

+6

これはあなたが探しているものではない可能性が高いですが、プログラムが無限ループに入ったのか終了したのかを調べる一般的な問題](http://en.wikipedia.org/wiki/Halting_problem))は解決できません。 – svick

+0

コードは正確に何をしていますか?これをユーザーに出力するのか、これは裏で実行されますか?結果をユーザーに出力している場合は、最初の10個を取得して結果を表示することができます。次に、次の10個のファイルを繰り返し実行するたびに、あるページから別のページに移動するナビゲーションがあります。 –

答えて

5

まあ、私の知る限りそのコード無限ループが発生することはありません - それは再帰的ではなく、ファイル・システムからXmlReaderは、最終的にはデータが不足します。しかし、長時間のを実行している可能性があります。場合によっては、サニティチェックを追加すると役立つかもしれません - これはカウンタ、または時間に対するチェックです。たとえば:

public static IEnumerable<SubjectNode> ReadSubjectNodes(string filePath) 
{ 
    int safetyCheck = 10000; 
    using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
    using (XmlReader xrdr = new XmlTextReader(fs)) 
     while (xrdr.Read()) { 
      if(--safetyCheck == 0) throw new SomeTypeOfException(); 
      ... more code 
     } 
    ... more code 
} 
+0

ありがとうございます。しかし、私は世話をする必要があります一般的なアドバイスはありますか? –

2

あなたはここに掲載されているコードは、終了条件があります。XmlTextReaderはそのストリームの終わりに達した場合。したがって、無限ループではありません。

これは実際にこれらを防止するために必要な作業です。すべてのループに終了条件があることを確認してください。コードを書くときは後で見直すよりはるかに簡単です。

2

コンパイル時に定義された反復数を持ち、その本体の反復カウンタを変更しないループを除いて、ループが無限に実行されるかどうかを決定的に事前に決定する方法はありません。

だけで無限ループしにくい良いコードを記述します。whileループ内の条件を検査した場合に、彼らはかもしれない原因無限ループを考えます。それでおしまい。

1

Infinateループは、パラメータが満たされるまで(whileループ)ループするときに発生しますが、ループを終了するためにwhile句が決して満たされない可能性があります。そして、それは永遠に続く。

再帰的ループを引き起こす可能性もあります。再帰的ループは、関数自体を呼び出す場所(または同様のもの)で、常に関数を呼び出しますが、終了することはありません。

while (xrdr.Read())は、.Read()が自動的に次の要素への移動を呼び出す限り、問題ありません。あなたのxrdrが無限のソースではないので、最終的に終わりに達して終了します。

関連する問題