在c#中进行除法的第二次计算时,时差为零

本文关键字:计算 时差 第二次 除法 | 更新日期: 2023-09-27 18:17:50

我需要以纳秒为单位最准确地计算除法所用的时差。请告诉我该怎么做。

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

请建议更准确的方法,在c#中使用不同的decimal digits调用相同的函数会导致不同的时间间隔。

我认为内存刷新应该在每次计算之前和之后完成。但是我不知道该怎么做。

为了准确性,我个人不喜欢这个tick方法。我也试过秒表,但它不起作用。请建议另一种最适合我的方法。我想要的结果像:0.0345或0.0714秒。

谢谢

在c#中进行除法的第二次计算时,时差为零

您在这行执行整数除法:

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.";

你将无法获得微纳米级的精度,但你将获得毫秒级的精度,误差范围

仍然可能得到0。你试图计算一个简单的除法运算需要多长时间。你可以在不到一秒的时间内做数百万个除法运算。您可能想要执行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;

这仍然不是完全现实的,但应该得到一个实际的数字。

由于时间以刻度为单位,只需通过乘以分母来增加分辨率:

double microseconds = tick / (TimeSpan.TicksPerMillisecond * 1000.0);

为什么不使用StopWatch类来计算时间呢?它是用来计算你想要的时间的。这里有一个链接供您参考。

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

//如果你想获得完整的毫秒数,你也可以这样做。

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