秒表和 0 毫秒通过 c#
本文关键字: | 更新日期: 2023-09-27 18:37:00
我尝试计算操作之间的时间。因此,用相同的代码编写两种方法,但使用不同的方法。起初,我确实喜欢:
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;
}
我有结果平均时间,例如 500 毫秒。N=1000000 及更多。
但是,我将此方法重写为两个方法:mainCalc,其中应该包含其他方法,例如获取 uid,id,名称等的平均时间。
主计算:
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。停止观看的结果=0毫秒!
是不是错误的结果?我不明白 - 什么使用秒表的方式对吗?
附言删除一个多余的秒表。
P.P.S.谢谢大家!
你的第一个例程应该是
for (int i = 0; i < N; i++)
{
stopWatch.Start();
var coll = _Snapshot.GetObject(uid);
stopWatch.Stop();
}
averageTime = stopWatch.Elapsed / N;
请注意,stopWatch.Start()
不会将秒表重置回零。
毫秒不是总毫秒。
毫秒是时间跨度的整个毫秒数。不是总毫秒数,而是双精度,因此您将在 1 毫秒内失去精度。
为什么你返回一个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;
}
您得到不同结果的原因是您在不同位置对毫秒数进行了四舍五入。在第一种方法中,您使用一个秒表并不断Start()
和Stop()
它。您的操作必须少于 1 毫秒,但当您反复启动和停止同一个秒表时,刻度总数仍将增加。这就是为什么 N=1000000 时,你只有 500 毫秒。
在第二种方法中,每次启动和停止新的秒表,并返回毫秒数。由于每个操作的平均值为 500/1000000 = 0.00005 毫秒,因此秒表的刻度将累积一些小值,但 ElapsedMilliseconds
(或 TimeSpan 的Milliseconds
)仍将为 0。
编辑:为了解决您的问题,一旦循环完成,第一个循环应该使用秒表的最终Elapsed
值(如 sgmoore 答案中的第二个示例)。第二种方法应从该方法返回时钟周期而不是毫秒,然后根据秒表的时钟周期频率计算毫秒数。
值(如 0.00005)求和,在第二个操作中,您将一堆 0 求和。