3

C# のアプリケーションからデータベース内の 100 レコードを更新する必要があります。

foreach ステートメントを使用し、ストアド プロシージャを呼び出して、次のように各レコードを更新しました。

foreach (var record in recordList)
{  
    dbWatch.Start();
    DbService.UpdateRecord(Id, ProcessDate, MessageID, task.Result.Email.TryTimes);
    dbWatch.Stop();
    LogMessage(string.Format("Single database row update toke:{0}",dbWatch.Elapsed));
}

開始時に各レコードを更新するのに約00:00:00.00123343かかることを除いて、すべてが正常に機能していますが、更新が進むにつれて、さらに時間がかかります。ほぼ 1000 レコードの後、各レコードを更新するのに約 00:00:04 秒かかります。

どうしてこうなったんだろう?

4

2 に答える 2

9

これは単なる測定ミスだと思います。ループは を再起動せず、StopWatch連続して開始および停止するだけです。だからElapsed必ず増えます。

全体の時間を測定したい場合:

dbWatch.Start();
foreach (var record in recordList)
{  
    DbService.UpdateRecord(Id, ProcessDate, MessageID, task.Result.Email.TryTimes);
}
dbWatch.Stop();
LogMessage(string.Format("All updates took:{0}",dbWatch.Elapsed));

各反復の時間を測定する場合は、次を使用しますStopWatch.Restart

foreach (var record in recordList)
{  
    dbWatch.Restart();
    DbService.UpdateRecord(Id, ProcessDate, MessageID, task.Result.Email.TryTimes);
    dbWatch.Stop();
    LogMessage(string.Format("Single database row update took:{0}",dbWatch.Elapsed));
}
于 2013-02-14T14:34:59.207 に答える
2

各更新の時間を測定する場合はdbWatch.Reset()、ループの最後または最初に呼び出す必要があります。Restart()私はそれを仮定しますSystem.Diagnostics.StopwatchMSDN - ストップウォッチを参照してください。

于 2013-02-14T14:34:27.210 に答える