奇怪的DirectoryInfo.EnumerateFiles()性能模式?

时间:2016-05-12 16:09:40

标签: c# .net performance enumeration

我正在尝试使用DirectoryInfo.EnumerateFiles(),并发现了我无法理解的这种奇怪的性能模式。如果我执行几个连续的枚举,则每个连续的枚举比前一个枚举花费大量时间。这很奇怪。但是甚至更奇怪的是,如果我在for循环中放置几个​​搜索,那么每次迭代时,搜索时间都会重置。这是我的方法和结果:

    static int i;
    static void Main(string[] args)
    {
        for (int j = 0; j < 15; j++)
        {
            var sw = new System.Diagnostics.Stopwatch();

            i = 0;
            sw.Start();
            EnumerateFiles();
            sw.Stop();
            Console.WriteLine(sw.Elapsed.ToString());

            i = 0;
            sw.Start();
            EnumerateFiles();
            sw.Stop();
            Console.WriteLine(sw.Elapsed.ToString());

            i = 0;
            sw.Start();
            EnumerateFiles();
            sw.Stop();
            Console.WriteLine(sw.Elapsed.ToString());

            i = 0;
            sw.Start();
            EnumerateFiles();
            sw.Stop();
            Console.WriteLine(sw.Elapsed.ToString());


            Console.WriteLine("====================================");
        }

        Console.ReadLine();
    }

    private static void EnumerateFiles()
    {
        foreach (var item in new System.IO.DirectoryInfo("d:\\aac").EnumerateFiles("*.*", System.IO.SearchOption.AllDirectories))
        {
            i++;
        }
    }

结果:

Total files: 5386

00:00:00.2868080
00:00:00.5720745
00:00:00.8443089
00:00:01.1315225
====================================
00:00:00.2729422
00:00:00.5275304
00:00:00.8259863
00:00:01.0712183
====================================
00:00:00.2457264
00:00:00.4642581
00:00:00.6948112
00:00:00.9178203
====================================
00:00:00.2198666
00:00:00.4503493
00:00:00.6717144
00:00:00.8951899
====================================
00:00:00.2391378
00:00:00.4602923
00:00:00.6767395
00:00:00.9082248
====================================
//last one (i == 15):
00:00:00.2138526
00:00:00.4437129
00:00:00.6626495
00:00:00.8794025

有谁知道为什么会这样? 现在,关于为什么我在一次迭代中进行四次搜索的问题的答案是:我正在尝试一些事情,测量性能并偶然发现这种异常,现在我想知道为什么会这样。

1 个答案:

答案 0 :(得分:5)

而不是所有sw.Start();

sw = System.Diagnostics.Stopwatch.StartNew();

再试一次

这里的问题是你没有重置秒表,你暂停它

您也可以拨打sw.Reset(); sw.Start();sw.Retart()