Dan*_*rza 29 .net c# windows filesystems performance
我已经看到了几个关于随机命名文件的建议,包括使用
System.IO.Path.GetRandomFileName()
Run Code Online (Sandbox Code Playgroud)
或使用
System.Guid
Run Code Online (Sandbox Code Playgroud)
并附加文件扩展名.
我的问题是:生成唯一文件名的最快方法是 什么?
Rex*_*x M 36
GUID会非常快,因为它的实现保证Windows可以在100纳秒的时间内生成至少16,384个GUID.(正如其他人指出的那样,规范不保证,只允许.但是,GUID生成确实非常非常快.真的.)任何网络上任何文件系统上发生冲突的可能性非常低.它足够安全,尽管最好始终检查文件名是否可用,但实际上你甚至不需要这样做.
因此,除了保存本身之外,您不会看到任何I/O操作,并且<0.2毫秒(在测试计算机上)生成名称本身.相当快.
Joe*_*orn 16
你要 System.IO.Path.GetTempFileName()
我实际上无法说它是否最快,但这是正确的方法,这更重要.
小智 5
好吧,我已经写了20年的文件系统驱动程序,并会说雷克斯是正确的.生成guid要快得多,因为它比搜索唯一文件名所需的开销要少得多.GetTempFileName实际上创建了一个文件,这意味着它必须通过整个文件系统驱动程序堆栈调用(谁知道将调用多少次调用并切换到内核模式.)GetRandomFileName听起来更快,但我相信GUID调用更快.人们没有意识到的是,即使测试文件的存在,也需要通过驱动程序堆栈进行完整的调用.它实际上导致open,get属性和close(至少有3个调用,具体取决于级别).实际上,它至少需要20个函数调用并转换到内核模式.GUIDS保证其独特性足以满足大多数用途.
我的建议是生成名称并仅在文件不存在时创建文件.如果是,抛出异常并捕获它,然后生成一个新的guid并再试一次.这样,你就没有错误的机会,晚上可以轻松入睡.
另外,检查错误是如此过度.如果假设错误,代码应设计成崩溃,或者捕获异常并处理它.在异常堆栈上推送和弹出以及寻址要快得多,而不是每次检查每个函数的错误.
| 归档时间: |
|
| 查看次数: |
44798 次 |
| 最近记录: |