2013-10-25 23 views
0

我试着计算操作之间的时间。 因此,用相同的代码编写两种方法,但使用不同的方法。 在第一种方式我不喜欢的是:StopWatch和0毫秒通过c#

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,至少应包含其他方法,f.e。 以获得uid,id,名字等的平均时间。

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和秒表= 0毫秒内method.And结果运行calcAcerageTimeUid2!

这是错误的结果或不?我不明白 - 使用stopWatch的方式是正确的?

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

P.P.S.感谢你们所有人!

+2

你是不是开始秒表在这些方法之一。(提示:中间的一个)。 –

+0

我不太明白你的观点,但是如果你想让它显示每次操作的时间,你应该重新启动或重新设置秒表。 –

+1

@SimonWhitehead:他正在使用'calcAverageTimeUid2'中的秒表并返回结果。 MainCalc正在总结总时间。 – mao47

回答

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

也许averageTimeUID = new TimeSpan(averageTimeUID.Ticks/N); ? – user2545071

+0

@ user2545071:你是对的,TimeSpan的构造函数需要Ticks而不是毫秒,我已经做了编辑。 –

2

你的第一个程序应该是

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

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

+0

首先不会给出有意义的结果,因为操作少于一毫秒。其次是坚实的。 – mao47

+0

@ mao47:你是对的,我会删除第一个例程。 – sgmoore

1

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

在第二种方法中,您每次启动并停止一个新的秒表,并返回毫秒。由于每个操作均1000000分之500= 0.00005毫秒,秒表的蜱会积累一些小的价值,但ElapsedMilliseconds(或时间跨度的Milliseconds)仍然将是0

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

总之,第一个操作是总结一堆数值(如0.00005),第二个操作是对一堆0进行求和。