首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的HDD基准测试-测量的传输速度太快了

C++中的HDD基准测试-测量的传输速度太快了
EN

Stack Overflow用户
提问于 2015-04-04 13:17:41
回答 3查看 3.4K关注 0票数 0

我正在试图开发一个微型基准系统在C++和我有困难的测量硬盘读写速度。更确切地说,我测量到的传输速度是巨大的: 400-600 MB/s的读和1000 MB/s以上的写入。我有一个5400 RPM硬盘驱动器(不是SSD),真正的读写速度(根据基准测试程序)大约是60 MB/s。

代码语言:javascript
复制
//blockSize is 4096
//my data buffer
char* mydata = (char*)malloc(1*blockSize);

//initialized with random data
srand(time(NULL));
for(int i=0;i<blockSize;i++){
    mydata[i] = rand()%256;
}

double startt, endt, difft;
int times = 10*25000;
int i=0,j=0;
DWORD written;
HANDLE f, g;
DWORD read;

f=CreateFileA(
    "newfolder/myfile.txt",
    GENERIC_WRITE,
    0,
    NULL,
    CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,
    NULL
    );

if(f==INVALID_HANDLE_VALUE){
    std::cout<<"Error openning for write.";
    return -1;
}

startt = clock();
for(i=0;i<times;i++){
    WriteFile(
    f,
    mydata,
    blockSize,
    &written,
    NULL
    );
}
endt = clock();

difft = 1.0*(endt-startt)/(1.0*CLOCKS_PER_SEC);
std::cout<<"\nWrite time: "<<difft;
std::cout<<"\nWrite speed: "<<1.0*times*blockSize/difft/1024/1024<<" MB/s";

CloseHandle(f);
//------------------------------------------------------------------------------------------------

g=CreateFile("newfolder/myfile.txt",
                GENERIC_READ,
                0,
                NULL,
                OPEN_ALWAYS,
                FILE_ATTRIBUTE_NORMAL,
                NULL
                );
if(g==INVALID_HANDLE_VALUE){
    std::cout<<"Error opening for read.";
    return -1;
}

startt = clock();

for(i=0;i<times;i++){
    ReadFile(
    g,
    mydata,
    blockSize,
    &read,
    NULL
    );
}
endt = clock();
difft = 1.0*(endt-startt)/(1.0*CLOCKS_PER_SEC);
std::cout<<"\nRead time:"<<difft;
std::cout<<"\nRead speed: "<<1.0*times*blockSize/difft/1024/1024<<" MB/s";

CloseHandle(g);

我也尝试使用fopen和fwrite函数,并得到了类似的结果。

我在另一台电脑上运行我的应用程序。写的速度差不多,读的速度仍然很大。

最有趣的是,应用程序实际上在大约2秒内创建了一个1GB文件,相当于500 MB/s的写入速度。

有人知道我做错了什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-04 13:26:55

从技术上讲,你没做错什么。问题是,每个操作系统都对所有I/O操作使用缓存。HDD本身也缓存一些数据,因此它可以高效地执行这些数据。

这个问题非常特定于平台。您需要以某种方式愚弄缓存。

也许,您应该看看这个库:Bonnie++。你可能会发现它很有用。它是为Unix系统编写的,但是源代码可以揭示一些有用的技术。

在Windows上,基于这一资源,传递给CreateFile函数的附加标志FILE_FLAG_NO_BUFFERING应该足以禁用此文件的缓冲。

引用:

在这种情况下,缓存可以关闭。这是在打开文件时通过将FILE_FLAG_NO_BUFFERING作为CreateFile的dwFlagsAndAttributes参数的值来完成的。当禁用缓存时,所有读和写操作都直接访问物理磁盘。但是,文件元数据可能仍然被缓存。若要将元数据刷新到磁盘,请使用FlushFileBuffers函数。

票数 4
EN

Stack Overflow用户

发布于 2015-04-04 13:24:39

您正在测量缓存的性能。尝试存储更多的数据,一旦缓存填充,数据应该直接写入磁盘。

票数 0
EN

Stack Overflow用户

发布于 2015-04-05 13:31:28

我想我已经搞清楚了。

非缓冲文件写入速度取决于WriteFile函数正在写入的数据的大小。实验表明,数据大小越大,写入速度越快。对于大量的数据(>1MB),它的性能甚至超过了缓冲写入,我可以通过写入大于2GB的数据来测量缓冲写入。

总之,可以通过以下方法精确地测量硬盘的写入速度:

  • 使用CreateFile打开文件并设置FILE_FLAG_NO_BUFFERING标志。
  • 使用WriteFile一次编写大量数据。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29446895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档