2017-02-03 5 views
0

forループが長すぎます。理由はわかりません。forループで費やされた時間の診断で問題が発生しました。C#

Stopwatch proctime = new Stopwatch(); 
Stopwatch innerlooptime = new Stopwatch(); 
Stopwatch outerlooptime = new Stopwatch(); 

proctime.Start(); 
int length = inbtable.Rows.Count; 
outerlooptime.Start(); 
for (int i = 0; i < length; i++) 
{ 
    outerlooptime.Stop(); 
    DataRow newrow = graphdata.NewRow(); 
    innerlooptime.Start(); 
    for (int j = 0; j < graphdata.Columns.Count; j++) 
    { 
     colname = graphdata.Columns[j].ColumnName; 
     newrow[j] = inbtable.Rows[i][colname]; 
    } 
    innerlooptime.Stop(); 
    outerlooptime.Start(); 
    graphdata.Rows.Add(newrow); 
} 
proctime.Stop(); 

あなたの時間それをすべて行う場合は、単に「内部ループ」やJ-ループに費やす時間は、第二の1/10のようなものです。

iループ内で費やされた時間は、jループではなく、1/10秒です。

合計ループに費やされる時間は約1秒です。 Time-iloop + Time-jloopは合計時間の1/5と同じです。残りの時間はどこに費やされていますか?処理時間(コード内でプロクティム)、アウターループ時間および内部ループ時間を比較しながら、画像を見てください。なぜそれらは、互いにもっと近いものに加わらないのですか?

enter image description here

+2

最初のループの外側でouterlooptimeを開始しますが、ループが開始するとすぐに停止しますか? –

+2

Visual Studioを使用している場合は、Microsoftのシンボルを有効にしてパフォーマンスプロファイラを実行してみてください(options-> debugging-> symbols)。 cpuプロファイルによって生成される「ホットパス」は、どのコールが最も時間を費やしているかを示す必要があります。 –

+0

James、まさに私が必要とするように聞こえる。ありがとう!今すぐ試すつもりです – metinoheat

答えて

1

あなたはあなたのタイマーの宣言を表示しませんが、変数名を使用すると、プロセッサ時間を見ている時間過ごすのではない実際の量されていることを示唆しています。プロセッサ時間とは、プロセッサコアが計算を実行する時間のことです。プロセッサはコンピュータ上で実行されているすべてのプロセス間で共有されているため、1秒で0.2秒のプロセッサ時間を受信するのが理想的です。

ではなく、ストップウォッチのクラスを使用してみてください:

// using System.Diagnostics; 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 

DoThings(); // run your code 

sw.Stop(); 
Debug.WriteLine("Actual time elapsed: " + sw.Elapsed.ToString()); 
+0

実際にはストップウォッチですが、私はループの処理時間としてproctimeを指定しました。 – metinoheat

+1

申し訳ありませんが、私のところに悪い仮定。たぶん 'DataRow newrow = graphdata.NewRow();'は多くの時間を費やしています。どちらのループでもカウントされていないようです。オブジェクトのインスタンス化に費やされた時間は無視できません... –

0

私は答えを考え出しました。それは本当に愚かだった。私は、機能の最後に私のメッセージボックスのステートメントの周りにストップウォッチを切り替えていたので、1つのストップウォッチが別のものとして報告されていました。私が投稿したコードの外に、いつもどこかで過ごしています。あなたの助けをありがとう。

関連する問題