为什么C#中的秒表的ElapsedTicks会崩溃?

时间:2015-10-01 09:12:43

标签: c# stopwatch

我想知道为什么 ElapsedTicks 值差异正在因为更改区域而发生变化。

代码

 Stopwatch timer = new Stopwatch( );
 #region "TimeCheck1"
 timer.Start( );
 string s1 = "HelloWorld";
 int length = s1.Length;
 int subLength = length / 2;
 string sA = s1.Substring(0, subLength);
 string sB = s1.Substring(subLength, subLength);
 timer.Stop( );
 Console.WriteLine("String: " + s1 + " Sub1: " + sA + " Sub2: " + sB + " Timer: " + timer.ElapsedTicks);
 #endregion "TimeCheck1"

 #region "TimeCheck2"
 timer.Start( );
 string s2 = "HelloWorld";
 int length2 = s2.Length;
 int subLength2 = length2 / 2;
 string s2A = subStr(s2, 0, subLength2);
 string s2B = subStr(s2, subLength2, subLength2);
 timer.Stop( );
 Console.WriteLine("String: " + s2 + " Sub1: " + s2A + " Sub2: " + s2B + " Timer: " + timer.ElapsedTicks);
 #endregion "TimeCheck2"

输出1

String: HelloWorld Sub1: Hello Sub2: World Timer: 12
String: HelloWorld Sub1: Hello Sub2: World Timer: 639

输出2

在交换区域TimeCheck1和TimeCheck2之后
String: HelloWorld Sub1: Hello Sub2: World Timer: 826
String: HelloWorld Sub1: Hello Sub2: World Timer: 828

为什么会出现这种差异?我在这里太困惑了。

编辑(我希望,这种方法不是问题)

private static string subStr( string str, int index, int len ) {
    string sub = "";
    int c = index;
    len = index + len;
    while( c != len ) {
        sub += str[ c ];
        c++;
    }
    return sub;
}

2 个答案:

答案 0 :(得分:4)

您错误地使用了StopWatch。你应该在第二次调用时调用Restart(),而不是Start()。如果你改变它,那么你的措施就会得到一致的结果

来自MSDN StopWatch.Start

  

当秒表实例测量多个间隔时,开始   方法从当前经过的时间值开始测量时间。一个   秒表实例计算并保留累计经过时间   跨多个时间间隔,直到实例重置。使用   调用Start之前的重置方法以清除累计经过的时间   在秒表实例中。使用Restart方法重置并启动   用一个命令秒表。

 Stopwatch timer = new Stopwatch( );
 timer.Start( );

 #region "TimeCheck1"
 .....
 #endregion "TimeCheck1"

 timer.Restart( );
 #region "TimeCheck2" 
 ....
 #endregion

现在,如果您反转区域,则测量值是相同的。并且您可以看到您的subStr在首次运行时会受到性能影响。

答案 1 :(得分:1)

因为Stopwatch取决于操作系统和硬件。

来自Stopwatch.IsHighResolution

  

秒表类使用的计时器取决于系统硬件和操作系统。如果秒表计时器基于高分辨率性能计数器,则IsHighResolution为真。否则,IsHighResolution为false,表示秒表计时器基于系统计时器。

每个间隔的刻度越多,分辨率越高。这意味着Stopwatch会更准确。

编辑:正如CodeCaster所提到的,有时候Stopwatch必须热身。可能是因为它使用高分辨率状态的硬件。根据我的经验,我可以告诉你这是真的。尝试只启动一个秒表。并计算滴答之间的差异(当前 - 开始)。在开始之后添加睡眠也可能有帮助。