秒表和0毫秒通过c#
我尝试计算两次操作之间的时间。 因此,用相同的代码编写两个方法,但使用不同的方法。 首先,我喜欢这样:秒表和0毫秒通过c#,c#,stopwatch,C#,Stopwatch,我尝试计算两次操作之间的时间。 因此,用相同的代码编写两个方法,但使用不同的方法。 首先,我喜欢这样: private static void calcAverageTimeUid(ISomeObject someObj, int N,ISnapshot _Snapshot) { Stopwatch stopWatch = new Stopwatch(); int averageTime = 0; var uid = someObj.Uid
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;
}
所以,我在这个方法中运行mainCalc和calcAcerageTimeUid2。秒表的结果=0毫秒
结果是否错误?我不明白用秒表的方法对吗
请删除多余的秒表之一
谢谢大家 你的第一个常规应该是
for (int i = 0; i < N; i++)
{
stopWatch.Start();
var coll = _Snapshot.GetObject(uid);
stopWatch.Stop();
}
averageTime = stopWatch.Elapsed / N;
for(int i=0;i
注意,
stopWatch.Start()
不会将秒表重置为零。您的第一个例程应该是
for (int i = 0; i < N; i++)
{
stopWatch.Start();
var coll = _Snapshot.GetObject(uid);
stopWatch.Stop();
}
averageTime = stopWatch.Elapsed / N;
for(int i=0;i
请注意,
stopWatch.Start()
不会将秒表重置为零。得到不同结果的原因是您在不同的位置舍入毫秒数。在第一种方法中,您使用一个秒表并连续地Start()
和Stop()
。您的操作所需时间必须少于1毫秒,但当您重复启动和停止同一秒表时,滴答声的总数仍将增加。这就是为什么N=1000000时,只有500毫秒
在第二种方法中,每次启动和停止一个新的秒表,并返回毫秒数。由于每次操作的平均值为500/1000000=0.00005 ms,秒表的滴答声将累积一些较小的值,但时间跨度的elapsedmillyses
(或毫秒
)仍将为0
编辑:为了解决您的问题,第一个循环应在循环完成后使用秒表的最终<代码>经过时间代码>值(如Sgmore回答中的第二个示例)。第二个方法应该返回该方法的滴答声,而不是毫秒,然后根据秒表的滴答声频率计算毫秒
总之,第一个操作是对一组值(如0.00005)求和,第二个操作是对一组0求和。得到不同结果的原因是,在不同的位置对毫秒数进行舍入。在第一种方法中,您使用一个秒表并连续地
Start()
和Stop()
。您的操作所需时间必须少于1毫秒,但当您重复启动和停止同一秒表时,滴答声的总数仍将增加。这就是为什么N=1000000时,只有500毫秒
在第二种方法中,每次启动和停止一个新的秒表,并返回毫秒数。由于每次操作的平均值为500/1000000=0.00005 ms,秒表的滴答声将累积一些较小的值,但时间跨度的elapsedmillyses
(或毫秒
)仍将为0
编辑:为了解决您的问题,第一个循环应在循环完成后使用秒表的最终<代码>经过时间代码>值(如Sgmore回答中的第二个示例)。第二个方法应该返回该方法的滴答声,而不是毫秒,然后根据秒表的滴答声频率计算毫秒
总之,第一个操作是对一组值求和,比如0.00005,第二个操作是对一组0求和。不是
毫秒是时间跨度的整毫秒数。不是两倍的总毫秒数,因此在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 );
}
事实并非如此
毫秒是时间跨度的整毫秒数。不是两倍的总毫秒数,因此在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 );
}
你不能用那种方法启动秒表。。(提示:中间的一个)。我不太明白你的意思,但是如果你想让秒表显示每次操作的时间量,你应该重新启动或重置秒表。@SimonWhitehead:他正在
calcAverageTimeUid2
中使用秒表并返回结果。MainCalc正在总结总时间。啊,是的,我现在看到了!愚蠢的我:)第一个片段有一个错误,它不会重置秒表。第二个代码段是正确的,但是当计时操作花费的时间少于一毫秒时,它会使用毫秒。您没有在这些方法中启动秒表。。(提示:中间的一个)。我不太明白你的意思,但是如果你想让秒表显示每次操作的时间量,你应该重新启动或重置秒表。@SimonWhitehead:他正在calcAverageTimeUid2
中使用秒表并返回结果。MainCalc正在总结总时间。啊,是的,我现在看到了!愚蠢的我:)第一个片段有一个错误,它不会重置秒表。第二个代码段正确地实现了这一点,但当计时操作所需时间少于一毫秒时,它会使用毫秒。第一个代码段不会给出有意义的结果,因为操作所需时间少于一毫秒。第二个是实数。第一个不会给出有意义的结果,因为运算时间小于一毫秒。第二个是实心的。可能averageTimeUID=newTimeSpan(averageTimeUID.Ticks/N)@user2545071:你是对的,TimeSpan的构造函数采用滴答而不是毫秒,我已经进行了编辑。可能averageTimeUID=new TimeSpan(averageTimeUID.Ticks/N)@user2545071:你是对的,TimeSpan的构造函数采用滴答而不是毫秒,我已经进行了编辑。
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;
}