windows – 如何尽可能快地创建CreateFile
发布时间:2020-12-13 20:35:16 所属栏目:Windows 来源:网络整理
导读:我需要在启动时阅读数千个小文件的内容.在linux上,只需使用fopen和读取速度非常快.在Windows上,这种情况发生得非常缓慢. 我已经使用ReadFileEx切换到使用Overlapped I / O(异步I / O),其中Windows在数据准备好读取时进行回调. 但是,实际上成千上万次调用Crea
我需要在启动时阅读数千个小文件的内容.在linux上,只需使用fopen和读取速度非常快.在Windows上,这种情况发生得非常缓慢.
我已经使用ReadFileEx切换到使用Overlapped I / O(异步I / O),其中Windows在数据准备好读取时进行回调. 但是,实际上成千上万次调用CreateFile本身仍然是一个瓶颈.请注意,我提供自己的缓冲区,打开NO_BUFFERING标志,提供SERIAL提示等.但是,对CreateFile的调用需要几十秒的时间,而在Linux上,所有操作都要快得多. 有没有什么可以让这些文件准备好更快地阅读? 对CreateFile的调用是: hFile = CreateFile(szFullFileName,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING | FILE_FLAG_SEQUENTIAL_SCAN,NULL);
与ntdll.dll中的内核系统调用NtCreateFile相比,kernel32.dll中的CreateFile有一些额外的开销.这是CreateFile调用以要求内核打开文件的真正功能.如果你需要打开大量的文件,NtOpenFile将通过避免Win32具有的特殊情况和路径转换来提高效率 – 无论如何都不适用于目录中的一堆文件.
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT HANDLE *FileHandle,IN ACCESS_MASK DesiredAccess,IN OBJECT_ATTRIBUTES *ObjectAttributes,OUT IO_STATUS_BLOCK *IoStatusBlock,IN ULONG ShareAccess,IN ULONG OpenOptions); HANDLE Handle; OBJECT_ATTRIBUTES Oa = {0}; UNICODE_STRING Name_U; IO_STATUS_BLOCK IoSb; RtlInitUnicodeString(&Name_U,Name); Oa.Length = sizeof Oa; Oa.ObjectName = &Name_U; Oa.Attributes = CaseInsensitive ? OBJ_CASE_INSENSITIVE : 0; Oa.RootDirectory = ParentDirectoryHandle; Status = NtOpenFile(&Handle,FILE_READ_DATA,&Oa,&IoSb,FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,FILE_SEQUENTIAL_ONLY); 主要缺点:Microsoft不支持此API用于用户模式.也就是说,自1993年第一次发布Windows NT以来,等效功能is documented for kernel mode use并没有改变. NtOpenFile还允许您打开相对于现有目录句柄的文件(示例中的ParentDirectoryHandle),这应该减少定位目录时的一些文件系统开销. 最后,正如Carey Gregory所说,NTFS在处理包含大量文件的目录时可能太慢了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- Microsoft Office 2007自动安装 – 编辑config.x
- 如何在Windows上从命令行播放音频文件?
- 注销策略中的Windows Server清除
- windows-server-2008-r2 – 没有设置Internet的新
- windows – 获取链接速度 – Win32_PerfRawData_
- Windows Phone 7 / Silverlight:如何进行导航?
- uwp – 对Microsoft Store API的请求始终返回空的
- 在windows中为msysgit设置openssh端口
- 用于Windows开发的C QT与C#.NET
- 通过Windows批处理从svn??look获取日志消息
热点阅读