我尝试计算操作之间的时间。 因此,使用相同的代码编写两个方法,但使用不同的方法。 首先,我喜欢这样:
private static void calcAverageTimeUid(ISomeObject someObj, int N,ISnapshot _Snapshot)
{
Stopwatch stopWatch = new Stopwatch();
int averageTime = 0;
var uid = someObj.Uid;
for (int i = 0; i < N; i++)
{
stopWatch.Start();
var coll = _Snapshot.GetObject(uid);
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
averageTime = averageTime + ts.Milliseconds;
}
averageTime = averageTime / N;
}
我有结果averageTime,如500毫秒。 N = 1000000以上。
但是,我将这个方法重写为两个方法:mainCalc,它应该包含其他方法,f.e。 获得uid,id,name等的平均时间。
mainCalc:
private static void mainCalc(ISomeObject someObj,int N,ISnapshot _Snapshot)
{
int averageTimeUID = 0;
for (int i = 0; i < N; i++)
{
var tmp=calcAverageTimeUid2(someObj,N,_Snapshot);
averageTimeUID+=tmp;
}
averageTimeUID = averageTimeUID / N;
}
和其他方法:
private static int calcAverageTimeUid2(ISomeObject someObj,int N,ISnapshot _Snapshot)
{
Stopwatch stopWatch = new Stopwatch();
var prop = someObj.Uid;
stopWatch.Start();
var obj = _Snapshot.GetObject(prop);
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
return ts.Milliseconds;
}
所以,我运行mainCalc并在此方法中运行calcAcerageTimeUid2。并且stopWatch的结果= 0毫秒!
这是错误的结果吗?我不明白 - 什么方式使用stopWatch对吧?
P.S。删除一个多余的StopWatch。
P.P.S。谢谢大家!
答案 0 :(得分:2)
你的第一个例程应该是
for (int i = 0; i < N; i++)
{
stopWatch.Start();
var coll = _Snapshot.GetObject(uid);
stopWatch.Stop();
}
averageTime = stopWatch.Elapsed / N;
注意,stopWatch.Start()
不将秒表重置为零。
答案 1 :(得分:1)
您得到不同结果的原因是因为您在不同位置舍入毫秒数。在第一种方法中,您使用一个秒表并连续Start()
和Stop()
。您的操作必须少于1毫秒,但是当您反复启动和停止相同的秒表时,滴答的总数仍会增加。这就是为什么N = 1000000你只有500毫秒。
在第二种方法中,每次都会启动和停止一个新的秒表,并返回毫秒数。由于每个操作的平均值为500/1000000 = 0.00005 ms,秒表的刻度将累积一些小值,但ElapsedMilliseconds
(或TimeSpan的Milliseconds
)仍为0。
编辑:为了解决你的问题,第一个循环应该在循环完成后使用秒表的最终Elapsed
值(就像sgmoore的答案中的第二个例子)。第二种方法应该从方法返回滴答而不是毫秒,然后从秒表的滴答频率计算毫秒数。
总之,第一个操作是你要汇总一堆像0.00005的值,在第二个你总结了一堆0。
答案 2 :(得分:1)
Milliseconds不是TotalMilliseconds。
毫秒是TimeSpan的整数毫秒。不是总的毫秒数是一个双倍,所以你在1ms内失去了精度。
为什么要返回int
而不是TimeSpan
?
试试这段代码:
private static void mainCalc(ISomeObject someObj, int N, ISnapshot _Snapshot)
{
var averageTimeUID = TimeSpan.Zero;
for (int i = 0; i < N; i++)
{
averageTimeUID += calcAverageTimeUid2(someObj,N,_Snapshot);
}
averageTimeUID = new TimeSpan( averageTimeUID.Ticks / N );
}
另一种方法:
private static TimeSpan calcAverageTimeUid2(ISomeObject someObj, int N, ISnapshot _Snapshot)
{
var stopWatch = new Stopwatch();
var prop = someObj.Uid;
stopWatch.Start();
var obj = _Snapshot.GetObject(prop);
stopWatch.Stop();
return stopWatch.Elapsed;
}