首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让CreateFile越快越好

如何让CreateFile越快越好
EN

Stack Overflow用户
提问于 2011-09-15 20:38:58
回答 2查看 6.5K关注 0票数 9

我需要在启动时读取数千个小文件的内容。在linux上,仅仅使用fopen和very是非常快的。在Windows上,这发生得非常慢。

我已经改用ReadFileEx的重叠I/O (异步I/O),当数据准备好读取时,Windows会做一个回调。

然而,对CreateFile本身的实际数以千计的调用仍然是一个瓶颈。注意,我提供了自己的缓冲区,打开了NO_BUFFERING标志,给出了串行提示,等等。然而,对CreateFile的调用需要10秒,而在linux上,一切都要快得多。

有没有什么办法可以让这些文件更快地准备好阅读?

对CreateFile的调用是:

代码语言:javascript
复制
            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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-10 11:03:20

ntdll.dll中的内核系统调用NtCreateFile相比,kernel32.dll中的CreateFile有一些额外的开销。这是CreateFile请求内核打开文件时调用的真正函数。如果您需要打开大量文件,NtOpenFile会更高效,因为它避免了Win32所具有的特殊情况和路径转换--这些情况无论如何都不适用于目录中的一堆文件。

代码语言:javascript
复制
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在处理包含大量文件的目录时可能太慢了。

票数 12
EN

Stack Overflow用户

发布于 2012-02-13 07:28:50

在发出Create file之前,尝试在MFT中有效地分页。这可以通过发出FSCTL_ENUM_USN_DATA来完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7430959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档