您好,感谢您审查我的问题。
我有一个系统,该系统配置有PCIe RAID0控制器x16线,分别通过m.2连接器连接到4个NVMe英特尔驱动器2Tb。使用ATTO Disk Benchmark应用程序,文件大小设置为8Gb,块大小设置为2Mb,最大读取速率为〜7Gb / S,同时通过查看任务管理器,磁盘活动百分比在此过程中达到峰值100% 。
我的问题:我使用Qt-Creator和MinGW-64bit编译器开发了一个简单的c ++应用程序,并使用FileApi.h标头打开了禁用系统缓存(无缓冲)的文件,并读取了相同的字节数(2Mb)从相同的文件大小(8Gb)得出的结果甚至还不是很接近,速率是如此之慢〜1.2Gb / S,并且在此过程中磁盘活动约为23%
这是我的代码:
#include <fileapi.h>
void main()
{
HANDLE dataFile;
dataFile = CreateFileA("File.bin", GENERIC_READ, 0, nullptr,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, nullptr);
FlushFileBuffers(dataFile);
if (dataFile == INVALID_HANDLE_VALUE)
return ;
//Start reading 3000 times from the file
int counter = 0;
while(counter < 3000){
char * buffer = new char [pktSize*sizeof(int)];
unsigned long read;
ReadFile(dataFile, buffer, 2097152 /*2 Megabytes */, &read, nullptr);
counter+=1;
delete[] buffer;
}
}
我非常感谢您的帮助或建议,非常感谢。
在每次迭代中,您都会在内存中分配新的缓冲区。这会导致大量内存通信并降低性能。初始化一次并重用:
char * buffer = new char [pktSize*sizeof(int)];
while(counter < 3000)
{
unsigned long read;
ReadFile(dataFile, buffer, 2097152 /*2 Megabytes */, &read, nullptr);
counter+=1;
}
delete[] buffer;
还应确保缓冲区大小pktSize*sizeof(int)
大于2097152 /*2 Megabytes */
。