繁体   English   中英

C++ FileApi.h 没有缓存,我如何让磁盘活动达到 100%

[英]C++ FileApi.h no caching, how do i get the disk activity to 100%

您好,感谢您查看我的问题。

我有一个配置有 PCIe RAID0 controller x16 线的系统,通过 m.2 连接器连接到 4 个 NVMe Intel 驱动器,每个驱动器 2Tb。 使用ATTO Disk Benchmark应用程序,文件大小设置为 8Gb,块大小设置为 2Mb,最大读取速率约为 7Gb/S,同时通过查看任务管理器,磁盘活动百分比在此过程中处于 100% 的峰值。

我的问题:我使用 Qt-Creator 和 MinGW-64bit 编译器开发了一个简单的 c++ 应用程序,使用FileApi.h header 打开一个禁用系统缓存的文件(无缓冲)并从相同的文件大小读取相同的字节数(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;
            }
        }

我感谢任何帮助或建议,并将非常感激。

在每次迭代中,您在 memory 中分配新缓冲区。 它会导致较大的 memory 流量和性能下降。 初始化一次并重用:

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 */

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM