我想知道为什么 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"
String: HelloWorld Sub1: Hello Sub2: World Timer: 12
String: HelloWorld Sub1: Hello Sub2: World Timer: 639
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;
}
答案 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
取决于操作系统和硬件。
秒表类使用的计时器取决于系统硬件和操作系统。如果秒表计时器基于高分辨率性能计数器,则IsHighResolution为真。否则,IsHighResolution为false,表示秒表计时器基于系统计时器。
每个间隔的刻度越多,分辨率越高。这意味着Stopwatch
会更准确。
编辑:正如CodeCaster所提到的,有时候Stopwatch
必须热身。可能是因为它使用高分辨率状态的硬件。根据我的经验,我可以告诉你这是真的。尝试只启动一个秒表。并计算滴答之间的差异(当前 - 开始)。在开始之后添加睡眠也可能有帮助。