2

最大 19,000 のエントリを含むコレクションがあり、foreach ステートメントで繰り返し処理しています。foreach の開始時に、文字列に 2 つの単語のうちの 1 つとブール値が含まれているかどうかを確認してから、続行するか、さらにいくつかの操作を実行します。

        foreach (SvnStatusEventArgs e in results) //results being my Collection
        {
            if ((e.Path.Contains("bin") || 
                e.Path.Contains("obj")) && !includeBinObjFolders)
                continue;

            //Do a bunch of things
        }

コンピューターが文字列の「bin」または「obj」をチェックしてからブール値をチェックするかどうかはわかりませんでしたが、文字列にこれら2つの「キーワード」のいずれかが含まれていてもかまわないことに気付くかもしれません。 .

基本的に、私が言っていることは、次の実行には別の時間がかかるということだと思いますか?

        foreach (SvnStatusEventArgs e in results) //results being my Collection
        {
            if (!includeBinObjFolders && 
                    (e.Path.Contains("bin") || 
                     e.Path.Contains("obj")
                     )
                )
                continue;

            //Do a bunch of things
        }

何らかの理由で、一番右の式を最初に評価し、左に進むという声が頭の後ろに聞こえます。もしそうなら、最初のほうが効率的ですよね?200 個以下のファイルを超えるコレクションをテストする簡単な方法がないため、単純にタイマーを使用するだけでは非常に近い結果が得られ、一方の方法が優れているかどうかを確認できません。

率直に言って、エンド ユーザーがこのコレクションで 500 を超えるデータに遭遇する可能性はほとんどないと思いますが、理論的には、ユーザー エラーが原因で発生する可能性があります。

編集ありがとうみんな。ここに投稿する前に検索してみましたが、ロジックに関して「短絡」という用語を忘れていたので、ここで私の冗長なタイトルに関連する答えを見つけるのに苦労していました.

編集 2実際には、2 つの for ループがそれぞれ 20,000 回繰り返される小さなコンソール アプリケーションを作成しました。1 つは Contains を最初にテストし、もう 1 つは Bool を最初にテストしました。これらの 2 つのループを 10 回繰り返すと、最初のブール値は 20K の反復ごとに平均で 0.5 ミリ秒かかるように見えます。最初に評価される Contains は、20K の反復ごとに約 3 ミリ秒かかります。本当に小さな違いです!

4

4 に答える 4

1

この例では、次を使用して評価を短絡&&しています。

foreach (SvnStatusEventArgs e in results) //results being my Collection
{
   if (!includeBinObjFolders && 
      (e.Path.Contains("bin") || 
       e.Path.Contains("obj")))
       continue;

   //Do a bunch of things
}

つまり、基本的に if !includeBinObjFolders=true評価を停止します。

この例では|| 、最初の 2 つの条件を評価するために を使用しています。そのうちの 1 つがtrue評価を停止します。

foreach (SvnStatusEventArgs e in results) //results being my Collection
{
   if ((e.Path.Contains("bin") || 
      e.Path.Contains("obj")) && !includeBinObjFolders)
      continue;

      //Do a bunch of things
}

正直なところ、どちらも他よりも著しく速いとは思いません。余談ですが、評価は左から右であり、決して右から左ではありません。

于 2013-10-15T19:53:25.447 に答える