File.Exists是一项昂贵的操作吗?

Mat*_*t W 16 .net io file exists

回复:http://msdn.microsoft.com/en-us/library/system.io.file.exists.aspx

有谁知道这是一个特别慢或锁定的操作,可能会影响大型环境中的服务器性能?

ang*_*son 11

在计算中,实际上没有"昂贵的操作"这样的东西,除非你考虑它的价格是多么昂贵.

例如,在现实世界中,对象的$ 2.000.000是否昂贵?如果是巴哈马的价格怎么办?它会贵吗?一箱牛奶怎么样?那贵吗?

您需要考虑的是,如果File.Exists您打算进行的整体操作是否昂贵,以及您是否真的有任何替代方案.

如果您没有任何替代方案,那么它是否昂贵是否重要?

例如,如果你做1检查文件是否存在,然后是否存在,你加载它,并花一个小时处理它,然后我会认为它不会被认为是昂贵的.

但是,如果在一个循环中调用它10次,以确定文件是否存在,然后如果存在,只需增加一个数字,那么它可能是您在那里执行的最昂贵的单个操作.

您可以确切知道的唯一方法是实际测量该方法调用所花费的时间,与您在同一操作中的其他操作相比.


t3c*_*b0t 9

在2016年,它似乎并不是非常昂贵,并且似乎没有真正的区别File.ExistsPathFileExists(当文件不存在时,为什么File.Exists()会慢得多?).我可以衡量的唯一区别是,检查一个不存在的文件然后检查现有文件会更快:

(在SSD上测试过)

[DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
private extern static bool PathFileExists(StringBuilder path);

void Main()
{
    var sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        File.Exists(@"c:\Home\Temp\test_.log");
    }
    sw.Stop();
    sw.Dump("File.Exists = false");

    sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        File.Exists(@"c:\Home\Temp\test.log");
    }
    sw.Stop();
    sw.Dump("File.Exists = true");

    var sb = new StringBuilder(@"c:\Home\Temp\test_.log");
    sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        PathFileExists(sb);
    }
    sw.Stop();
    sw.Dump("PathFileExists = false");

    sb = new StringBuilder(@"c:\Home\Temp\test.log");
    sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        PathFileExists(sb);
    }
    sw.Stop();
    sw.Dump("PathFileExists = true");

}
Run Code Online (Sandbox Code Playgroud)

结果

  • 受此启发,我在 https://github.com/sntcz/FileExistsBenchmark 上编写了更多基准测试 (2认同)

Yan*_*rtz 7

我认为不是(文件操作在大多数操作系统上进行了大量优化和缓存),而且大多数其他操作更可能是这里的罪魁祸首(套接字,数据库访问,一般处理等).但是,像往常一样,最好的方法是实际分析您的应用程序,看看它是否是一个热点.


Bri*_*uch 5

锁定号码 慢,取决于你比较它.就I/O而言,它相当便宜,但与其他操作相比,I/O整体速度通常较慢.所以,如果你必须使用它,它不会伤害太糟糕.但是,我尽量不要把它称之为真正必要的次数!:-)