为什么第二个for循环总是比第一个循环执行得快?

Bob*_*lan 6 c# performance diagnostics winforms

我试图弄清楚for循环是否比foreach循环更快,并且使用System.Diagnostics类来计算任务的时间.在运行测试时,我注意到我先放入的循环始终比最后一循环执行得慢.有人可以告诉我为什么会这样吗?我的代码如下:

using System;
using System.Diagnostics;

namespace cool {
    class Program {
        static void Main(string[] args) {
            int[] x = new int[] { 3, 6, 9, 12 };
            int[] y = new int[] { 3, 6, 9, 12 };

            DateTime startTime = DateTime.Now;
            for (int i = 0; i < 4; i++) {
                Console.WriteLine(x[i]);
            }
            TimeSpan elapsedTime = DateTime.Now - startTime;

            DateTime startTime2 = DateTime.Now;
            foreach (var item in y) {
                Console.WriteLine(item);
            }
            TimeSpan elapsedTime2 = DateTime.Now - startTime2;

            Console.WriteLine("\nSummary");
            Console.WriteLine("--------------------------\n");
            Console.WriteLine("for:\t{0}\nforeach:\t{1}", elapsedTime, elapsedTime2);

            Console.ReadKey();
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

for:            00:00:00.0175781
foreach:        00:00:00.0009766
Run Code Online (Sandbox Code Playgroud)

Gaz*_*Gaz 16

可能是因为类(例如Console)需要第一次进行JIT编译.您将通过首先调用所有方法(JIT(温暖然后)),然后执行测试来获得最佳指标.

正如其他用户所指出的那样,4次传球永远不足以向您展示差异.

顺便提一下,for和foreach之间的性能差异可以忽略不计,使用foreach的可读性好处几乎总是超过任何边际性能优势.


tan*_*ius 7

  1. 我不会使用DateTime来衡量性能 - 尝试Stopwatch上课.
  2. 仅用4次测量就不会给你带来好成绩.更好地使用> 100.000次传递(您可以使用外部循环).不要Console.WriteLine在你的循环中.
  3. 更好的是:使用分析器(如Redgate ANTS或NProf)

  • 秒表类(通过MSDN):http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx (4认同)