コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【C#】ファイルの一覧を取得する Directory.GetFiles と Directory.EnumerateFiles の比較

概要

using System;
using System.Diagnostics;
using System.IO;

class Program
{
    static void Main()
    {
        var path    = "【対象のフォルダ】";
        var pattern = "【検索パターン】";
        var option  = SearchOption.AllDirectories;

        var sw1 = new Stopwatch();
        sw1.Start();
        var result1 = Directory.GetFiles( path, pattern, option );
        sw1.Stop();

        var sw2 = new Stopwatch();
        sw2.Start();
        var result2 = Directory.EnumerateFiles( path, pattern, option );
        sw2.Stop();

        Console.WriteLine( sw1.Elapsed.TotalSeconds );
        Console.WriteLine( sw2.Elapsed.TotalSeconds );
    }
}

約 10,000 個のファイルを対象に
ファイルの一覧を取得する上記のプログラムを実行したところ

関数 処理時間
Directory.GetFiles 2.80 秒
Directory.EnumerateFiles 0.08 秒

Directory.GetFiles よりも Directory.EnumerateFiles の方が早く終わりました
(Directory.GetFiles は配列を返す分だけ遅くなる)

上記のようにファイルの一覧を取得するだけであれば
Directory.EnumerateFiles の方が早いですが、

using System;
using System.Diagnostics;
using System.IO;

class Program
{
    static void Main()
    {
        var path    = "【対象のフォルダ】";
        var pattern = "【検索パターン】";
        var option  = SearchOption.AllDirectories;

        var sw1 = new Stopwatch();
        sw1.Start();
        var result1 = Directory.GetFiles( path, pattern, option );
        foreach ( var s in result1 )
        {
            
        }
        sw1.Stop();

        var sw2 = new Stopwatch();
        sw2.Start();
        var result2 = Directory.EnumerateFiles( path, pattern, option );
        foreach ( var s in result2 )
        {
            
        }
        sw2.Stop();

        Console.WriteLine( sw1.Elapsed.TotalSeconds );
        Console.WriteLine( sw2.Elapsed.TotalSeconds );
    }
}

このように、Directory.GetFiles や Directory.EnumerateFiles で取得したファイル一覧を
foreach で参照する部分まで含めて時間を図った場合は

関数 処理時間
Directory.GetFiles 1.26 秒
Directory.EnumerateFiles 1.19 秒

このような結果になりました

参考サイト様