gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:59:10 31 4
gpt4 key购买 nike

我正在尝试用 C++ 开发一个小型基准测试系统,但我在测量 HDD 读写速度时遇到了问题。更确切地说,我测量的传输速度是巨大的:读取 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);

我也尝试使用 fopenfwrite 函数,我得到了类似的结果。

我在另一台计算机上运行我的应用程序。写入速度还行,读取速度还是很快的。

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

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

最佳答案

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

这个问题是非常特定于平台的。您需要以某种方式欺骗缓存。

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

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

引用:

In these situations, caching can be turned off. This is done at the time the file is opened by passing FILE_FLAG_NO_BUFFERING as a value for the dwFlagsAndAttributes parameter of CreateFile. When caching is disabled, all read and write operations directly access the physical disk. However, the file metadata may still be cached. To flush the metadata to disk, use the FlushFileBuffers function.

关于c++ - C++ 中的 HDD 基准测试 - 测量的传输速度太快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29446895/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com