神奇的for循环,让你的for循环执行100w + 1比100w次快200w倍

  最近在研究利用api模拟键盘鼠标的动作,类似于按键精灵,然后发现只要是标签存储的值,都没办法用api抓取窗体句柄。于是乎便有了操作内存取值的想法,这就用到了另外一个api了。

  因为内存寻值,有一个区间段,我们设定的是从0x00400000到0x7FFFFFFF(这些值是根据CE的区间得来的),然而如果利用for循环去遍历,代码如下:

1 Stopwatch watch = new Stopwatch();
2 watch.Start();
3 int start = 0x00400000, end = 0x7FFFFFFF;
4 for (int i = start; i < end; i++)
5 {
6
7 }
8 watch.Stop();
9 Console.WriteLine("耗时:" + watch.Elapsed);

  结果为:

  然而当我们在for循环中加入一个 + 1时,就出现了神奇的效果,代码如下:

1 Stopwatch watch = new Stopwatch();
2 watch.Start();
3 int start = 0x00400000, end = 0x7FFFFFFF;
4 for (int i = start; i < end + 1; i++)
5 {
6
7 }
8 watch.Stop();
9 Console.WriteLine("耗时:" + watch.Elapsed);

  结果为:

  让人震惊的效果,相差实在太大了,于是我又做了其他的测试,代码如下:

 1 int times = 1000000;
2 Stopwatch watch1 = new Stopwatch();
3 watch1.Start();
4 for (int i = 0; i < times; i++)
5 {
6 }
7 watch1.Stop();
8 Console.WriteLine(watch1.Elapsed + string.Format("(执行{0}次所需要的时间)", times));
9
10 Stopwatch watch2 = new Stopwatch();
11 watch1.Start();
12 for (int i = 0; i < times + 1; i++)
13 {
14 }
15 watch1.Stop();
16 Console.WriteLine(watch2.Elapsed + string.Format("(执行{0} + 1次所需要的时间)", times));
17
18 times = int.MaxValue;
19 Stopwatch watch3 = new Stopwatch();
20 watch3.Start();
21 for (int i = 0; i < times; i++)
22 {
23 }
24 watch3.Stop();
25 Console.WriteLine(watch3.Elapsed + string.Format("(执行{0}次所需要的时间)", times));
26
27 Stopwatch watch4 = new Stopwatch();
28 watch4.Start();
29 for (int i = 0; i < times + 1; i++)
30 {
31 }
32 watch4.Stop();
33 Console.WriteLine(watch4.Elapsed + string.Format("(执行{0} + 1次所需要的时间)", times));
34 Console.ReadKey();

  结果,也是同样的神奇,相差甚大:


  对于这个问题,我也是摸不着头脑,谁知道原理的请告知一下,先记录下来,找资料去。

原文地址:https://www.cnblogs.com/ahl5esoft/p/2252585.html