C++ 使用Procmon分析读取操作
我试图使用带有Procmon的ifstream分析一个基本的读取操作 用于读取操作的代码的一部分,我试图从文件中读取16kb大小的数据:C++ 使用Procmon分析读取操作,c++,file-io,procmon,C++,File Io,Procmon,我试图使用带有Procmon的ifstream分析一个基本的读取操作 用于读取操作的代码的一部分,我试图从文件中读取16kb大小的数据: char * buffer = new char[128000]; ifstream fileHandle("file.txt"); fileHandle.read(buffer, 16000); cout << buffer << endl; fileHandle.close(); char*buffer=新字符[128000];
char * buffer = new char[128000];
ifstream fileHandle("file.txt");
fileHandle.read(buffer, 16000);
cout << buffer << endl;
fileHandle.close();
char*buffer=新字符[128000];
ifstream文件句柄(“file.txt”);
读取(缓冲区,16000);
库特
那么,这是否意味着每个4kb大小有4个操作
这正是它所说的
如果是这样的话,为什么会发生这种情况,而不仅仅是一个16 kb大小的ReadFile操作呢
仅仅因为您要求16000字节,并不意味着ifstream
实际上可以在一次操作中读取16000字节。文件系统通常不允许如此大的读取,通常有一个上限。即使您增加了ifstream
内部使用的内部缓冲区的大小,也不能保证文件系统将接受更大的读取大小
read()
的约定是,除非遇到EOF/错误,否则它将返回请求的字节数。如何实现内部读取是一个实现细节。在这种情况下,ifstream
必须读取四个4KB块才能返回16000字节
那么,这是否意味着每个4kb大小有4个操作
对
如果是这样的话,为什么会发生这种情况,而不仅仅是一个16 kb大小的ReadFile操作呢
可能是因为编译器附带的标准库将文件流缓冲区的默认大小设置为4KB;由于read
操作必须通过缓冲区,因此在满足您的请求之前,缓冲区必须填充(通过操作系统调用)并清空4次。请注意,您可以使用更改fstream
的内部缓冲区。我认为,在这个级别上,除了建议CRT的设计者使用4096作为默认块大小之外,文件系统实现在任何其他方面都不重要ReadFile
本身就是一个相当高级的API,您可以向它请求任何大小(并传递任何类型的文件句柄),它会很乐意地执行,阻塞直到它获取所有请求的数据;文件系统驱动程序的限制远远低于它。我将通过更改内部缓冲区进行更多的实验,看看它是如何工作的。对于16 KB,我怀疑您是否能够看到任何显著的差异。。。初始IO成本将完全隐藏两个额外系统调用的成本,如果您想要获得性能fstream
,则无论如何都是死路一条。谢谢。我能够使用fileHandle.rdbuf在一次操作中读取16 Kb。