c#中除法的第二次计算中的时间差为零

时间:2011-12-13 21:09:53

标签: c# windows-phone-7 buffer

我需要在纳秒内最准确地计算出划分的时间差。请告诉我这样做。

目前,我使用的是一种精度较低的方法,其中的问题是:执行第一次计算时,它会显示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秒。

由于

4 个答案:

答案 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