我需要在纳秒内最准确地计算出划分的时间差。请告诉我这样做。
目前,我使用的是一种精度较低的方法,其中的问题是:执行第一次计算时,它会显示87
毫秒或65
毫秒作为答案。但是当第二次或更多次再次调用该函数时,它只显示0
毫秒。
代码是:
long startTick = DateTime.Now.Ticks;
double result = (double)22 / 7;
result = System.Math.Round(result, digit);
long endTick = DateTime.Now.Ticks;
long tick = endTick - startTick;
double milliseconds = tick / TimeSpan.TicksPerMillisecond;
time.Text = result + "\nThe division took " + milliseconds + " milliseconds to complete.";
digit是函数的参数,它是可变的。无论数字的值是什么,在第一次调用函数后,毫秒值仍为0
....
请建议更准确的方法,使用不同的decimal digits
调用相同的函数将导致c#for Windows Phone的时间间隔不同。
我认为应该在每次计算之前和之后进行内存刷新。但我不知道该怎么做。
我不喜欢这种tick方法的准确性。我也试过秒表,但它不起作用。请建议另一种最适合我的方法。我想要的结果如:0.0345或0.0714秒。
由于
答案 0 :(得分:4)
您正在此行执行整数除法:
double milliseconds = tick / TimeSpan.TicksPerMillisecond;
即使您将其声明为双精度数,long
除以long
也会截断小数。你最好这样做:
double milliseconds = (double)tick / TimeSpan.TicksPerMillisecond;
或者更好的是,只需将所有内容放在一起:
DateTime start = DateTime.Now;
double result = (double)22 / 7;
result = System.Math.Round(result, digit);
DateTime end = DateTime.Now;
double milliseconds = (end - start).TotalMilliseconds;
time.Text = result + "\nThe division took " + milliseconds + " milliseconds to complete.";
您将无法获得微观或纳米级别的精度,但您将获得毫秒级的精度和误差。
但仍然可能会为零。您正在尝试计算简单除法运算所需的时间。您可以在不到一秒的时间内完成百万的除法运算。你可能想要做1,000,000次,然后将结果除以1,000,000:
DateTime start = DateTime.Now;
for (var i = 0; i < 1000000; i++)
{
double result = (double)22 / 7;
result = System.Math.Round(result, digit);
}
DateTime end = DateTime.Now;
double milliseconds = (end - start).TotalMilliseconds / 1000000;
这仍然不完全现实,但应该为您提供实际数字。
答案 1 :(得分:0)
由于您有时间刻度,只需乘以分母:
即可提高分辨率double microseconds = tick / (TimeSpan.TicksPerMillisecond * 1000.0);
答案 2 :(得分:0)
为什么不使用StopWatch Class进行时间计算。 它意味着计算你想要的时间.. 这是一个供您参考的链接。
http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
答案 3 :(得分:0)
//如果你想获得整整几毫秒,你也可以做这样的事情。
dateStartTime = Convert.ToDateTime(DateTime.Now.TimeOfDay.ToString());
//then where you end the code do this
dateEndTime = Convert.ToDateTime(DateTime.Now.TimeOfDay.ToString());
ddateDuration = (TimeSpan)(dateEndTime - dateStartTime);
then to display out what you are actually looking for in terms of miliseconds do
Console.WriteLine(ddateDuration.ToString().Substring(0, 8));
// or some other method that you are using to display the results