程序员思考过程:确定在使用Windows API的ReadFile时要读取的最大字节数

我需要调用Windows APIReadFile函数:

BOOL WINAPI ReadFile( _In_ HANDLE hFile, _Out_ LPVOID lpBuffer, _In_ DWORD nNumberOfBytesToRead, _Out_opt_ LPDWORD lpNumberOfBytesRead, _Inout_opt_ LPOVERLAPPED lpOverlapped ); 

我感兴趣的是第三个:

nNumberOfBytesToRead [in]

要读取的最大字节数。

我对“幻数”没有太多兴趣,但是经验丰富的程序员需要确定要放在那里的数字,最好是用数字来表示。

另外请记住,我正在用汇编编写我的程序,所以我从这个angular度对思考过程更感兴趣。


  • https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx

这需要对Windows和硬件有足够的了解。 但总的来说,这里有一些可能的方向:

  • 写缓冲还是无缓冲? 如果没有缓冲,那么您甚至可能无法选择大小,但必须遵循严格的规则,以便缓冲区的大小和对齐。
  • 一般来说,您希望让操作系统尽可能多地处理工作,因为它比您在用户空间中知道更多关于存储设备本身及其各种用户。 所以,如果可能的话,你可能想一下子把所有的东西都拿走(见下面的几点)。
  • 如果事实证明这样做不够好,可以尝试通过各种大小的游戏来胜过它,以解决您可能会使用当前缓冲区的情况,因为某些原因,操作系统不会总是利用不同的要求。
  • 否则,您可能会在磁盘扇区大小和页面大小倍数之间的任何位置使用大小,因为这些大小很可能已经缓存在某处,并且也可以直接映射到实际的硬件请求。
  • 除了表演之外,还有一个问题是,在任何特定的时间里,你有多少钱能够存储在你的程序的内存中。
  • 还有一个问题是发送大的请求,这可能会阻止其他进程得到进入的机会,并获得一些数据 – 如果操作系统没有以某种方式处理。
  • 也有可能,通过请求太大块操作系统可能推迟你的请求,直到其他进程得到他们谦虚的服务。 另一方面,如果是相交的地址,它可能实际上首先为您提供服务,然后为缓存中的其他服务提供服务。

一般来说,你可能想玩,直到你得到足够好的东西。

那里的paremeter只是为了保护你免受缓冲区溢出,所以你当然必须输入为此分配的缓冲区的大小。 除此之外,你应该只读取尽可能多的字节,因为你对这个确切时间感兴趣。 现代操作系统将总是使用页面缓存,任何后续的访问文件将会像访问内存一样快。 如果您需要它,也可以强制操作系统预先缓存文件。
编辑:我的经验是反对什么Yam马尔维奇和其他人推荐。 缓存文件和分块读取到理想大小正是操作系统在那里做的事情。 不要以为智取它,只读你所需要的东西。