我正在试图开发一个微型基准系统在C++和我有困难的测量硬盘读写速度。更确切地说,我测量到的传输速度是巨大的: 400-600 MB/s的读和1000 MB/s以上的写入。我有一个5400 RPM硬盘驱动器(不是SSD),真正的读写速度(根据基准测试程序)大约是60 MB/s。
//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的写入速度。
有人知道我做错了什么吗?
发布于 2015-04-04 13:26:55
从技术上讲,你没做错什么。问题是,每个操作系统都对所有I/O操作使用缓存。HDD本身也缓存一些数据,因此它可以高效地执行这些数据。
这个问题非常特定于平台。您需要以某种方式愚弄缓存。
也许,您应该看看这个库:Bonnie++。你可能会发现它很有用。它是为Unix系统编写的,但是源代码可以揭示一些有用的技术。
在Windows上,基于这一资源,传递给CreateFile函数的附加标志FILE_FLAG_NO_BUFFERING应该足以禁用此文件的缓冲。
引用:
在这种情况下,缓存可以关闭。这是在打开文件时通过将FILE_FLAG_NO_BUFFERING作为CreateFile的dwFlagsAndAttributes参数的值来完成的。当禁用缓存时,所有读和写操作都直接访问物理磁盘。但是,文件元数据可能仍然被缓存。若要将元数据刷新到磁盘,请使用FlushFileBuffers函数。
发布于 2015-04-04 13:24:39
您正在测量缓存的性能。尝试存储更多的数据,一旦缓存填充,数据应该直接写入磁盘。
发布于 2015-04-05 13:31:28
我想我已经搞清楚了。
非缓冲文件写入速度取决于WriteFile函数正在写入的数据的大小。实验表明,数据大小越大,写入速度越快。对于大量的数据(>1MB),它的性能甚至超过了缓冲写入,我可以通过写入大于2GB的数据来测量缓冲写入。
总之,可以通过以下方法精确地测量硬盘的写入速度:
CreateFile打开文件并设置FILE_FLAG_NO_BUFFERING标志。WriteFile一次编写大量数据。https://stackoverflow.com/questions/29446895
复制相似问题