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次,以确定文件是否存在,然后如果存在,只需增加一个数字,那么它可能是您在那里执行的最昂贵的单个操作.
您可以确切知道的唯一方法是实际测量该方法调用所花费的时间,与您在同一操作中的其他操作相比.
在2016年,它似乎并不是非常昂贵,并且似乎没有真正的区别File.Exists和PathFileExists(当文件不存在时,为什么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)
我认为不是(文件操作在大多数操作系统上进行了大量优化和缓存),而且大多数其他操作更可能是这里的罪魁祸首(套接字,数据库访问,一般处理等).但是,像往常一样,最好的方法是实际分析您的应用程序,看看它是否是一个热点.
锁定号码 慢,取决于你比较它.就I/O而言,它相当便宜,但与其他操作相比,I/O整体速度通常较慢.所以,如果你必须使用它,它不会伤害太糟糕.但是,我尽量不要把它称之为真正必要的次数!:-)
| 归档时间: |
|
| 查看次数: |
8694 次 |
| 最近记录: |