Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Procmon分析读取操作_C++_File Io_Procmon - Fatal编程技术网

C++ 使用Procmon分析读取操作

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];

我试图使用带有Procmon的ifstream分析一个基本的读取操作

用于读取操作的代码的一部分,我试图从文件中读取16kb大小的数据:

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。