秒表和 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.谢谢大家!

秒表和 0 毫秒通过 c#

你的第一个例程应该是

    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 求和。

相关文章:
  • 没有找到相关文章