通过c#进行StopWatch和0毫秒

时间:2013-10-25 11:35:55

标签: c# stopwatch

我尝试计算操作之间的时间。 因此,使用相同的代码编写两个方法,但使用不同的方法。 首先,我喜欢这样:

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;

    }

我有结果averageTime,如500毫秒。 N = 1000000以上。

但是,我将这个方法重写为两个方法:mainCalc,它应该包含其他方法,f.e。 获得uid,id,name等的平均时间。

mainCalc:

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。并且stopWatch的结果= 0毫秒!

这是错误的结果吗?我不明白 - 什么方式使用stopWatch对吧?

P.S。删除一个多余的StopWatch。

P.P.S。谢谢大家!

3 个答案:

答案 0 :(得分:2)

你的第一个例程应该是

    for (int i = 0; i < N; i++)
    {
        stopWatch.Start();
        var coll = _Snapshot.GetObject(uid);
        stopWatch.Stop();
    }
    averageTime = stopWatch.Elapsed / N;

注意,stopWatch.Start() 将秒表重置为零。

答案 1 :(得分:1)

您得到不同结果的原因是因为您在不同位置舍入毫秒数。在第一种方法中,您使用一个秒表并连续Start()Stop()。您的操作必须少于1毫秒,但是当您反复启动和停止相同的秒表时,滴答的总数仍会增加。这就是为什么N = 1000000你只有500毫秒。

在第二种方法中,每次都会启动和停止一个新的秒表,并返回毫秒数。由于每个操作的平均值为500/1000000 = 0.00005 ms,秒表的刻度将累积一些小值,但ElapsedMilliseconds(或TimeSpan的Milliseconds)仍为0。

编辑:为了解决你的问题,第一个循环应该在循环完成后使用秒表的最终Elapsed值(就像sgmoore的答案中的第二个例子)。第二种方法应该从方法返回滴答而不是毫秒,然后从秒表的滴答频率计算毫秒数。

总之,第一个操作是你要汇总一堆像0.00005的值,在第二个你总结了一堆0。

答案 2 :(得分:1)

Milliseconds不是TotalMilliseconds

毫秒是TimeSpan的整数毫秒。不是总的毫秒数是一个双倍,所以你在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 );
}

另一种方法:

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;
}