- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试用 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);
我也尝试使用 fopen 和 fwrite 函数,我得到了类似的结果。
我在另一台计算机上运行我的应用程序。写入速度还行,读取速度还是很快的。
最有趣的是,该应用程序实际上在大约 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/
背景 我一直在使用 Win32_DiskDrive 来查找闪存(USB 笔、SD 卡等),但在其他计算机上进行一些测试后,我发现它们并不总是被发现。因此,我使用 Win32_LogicalDisk,因
在我的应用程序中,我需要大约每 50 毫秒在一个大文件(大约 2-7 GB)中连续写入数据 block (大约 2MB)。这是按顺序、循环方式完成的,所以我将一个 block 一个 block 地写入
我正在编写自己的文件搜索(为什么是因为我想要/可以 - 而不是寻找现有程序)。我可以使用 DriveInfo.GetDrives() 在 c# 中获取所有驱动器方法。理想情况下,我希望仅在独立磁盘的驱
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 上个月关门。 Improve this qu
在我们的开发环境中,我们长期以来一直通过各种 SQL Server 版本和不同的环境配置为每个产品使用特定的备份和恢复脚本,没有出现任何问题。 最近,我们已升级到 SQL Server 2012 作为
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Storing Images in DB - Yea or Nay? 非常简单,我正在托管一个用户可以上传图
这是我的案例: 我正在使用 ABCPDF 从我需要在网络上显示的 .DOCX 文件生成 HTML 文档。当您从 ABCPDF 导出为 HTML 时,您会生成一个 HTML 和一个包含支持文件(.css
我有一个使用 50 字节数据结构的文件格式(.STL,立体光刻,结构是标准的,不能更改。不要与标准模板库混淆)。直接从硬盘读取会导致读取错误数据,因为50字节不是4的倍数。 在整个 50 字节的结构中
我正在尝试在硬盘驱动器上存储一个大小约为 80Gb 的简单大型哈希表(64 位键,64 位值)。如果我想获得最佳性能,最有效的方法是什么? 要查找的键是完全随机的,我必须每 10 毫秒查找一次?是否有
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我正在尝试确定文件是否在本地驱动器上。我找到了 GetDriveType() WINAPI检索驱动器类型。然而,阅读似乎返回值的描述,这就是我的理解,它将闪存驱动器检索为 FIXED,这不是我想要的。
在发表这篇文章之前,我搜索并尝试了 4 天所有的东西,比如 https://www.codeproject.com/kb/gdi-plus/memimage.aspx ,但我是编程新手。 这段代码(不
我在 Google Cloud 中创建了一个10 GB HDD 和 3.75 GB RAM 实例,并在那里托管了一个相当繁重的数据库事务应用程序的后端/API。操作系统是 Ubuntu 14.04 L
我需要将我所有的数据库从操作系统死机的硬盘移动到新硬盘。 我已将所有文件从/var/lib/mysql 移动到新位置,一切正常,除了 mysql 用户名。当我访问 phpmyadmin 中的权限选项卡
我想运行一个机器学习算法作为我的残局研究代码,该代码迄今为止未经证实且未发布用于文本挖掘目的。文本已经获得,但从 Common Crawl 获得的 warc 格式中被删除。我正在为机器学习目的准备数据
我正在尝试用 C++ 开发一个小型基准测试系统,但我在测量 HDD 读写速度时遇到了问题。更确切地说,我测量的传输速度是巨大的:读取 400-600 MB/s,写入 1000 MB/s 以上。我有一个
发生硬盘故障。 因此,添加了一个新的主 HDD,并将旧 HDD 添加为辅助 HDD。 我正在尝试安装辅助硬盘,但出现错误。 我制作了/media/qwe/。 然后我在 Putty 上使用这些 SSH
我们有一个嵌入式 Linux 构建,它以处于 sleep 模式(硬件)的 HDD 启动。然后软件启动并为驱动器供电。 Linux 检测到驱动器正常: ata1: exception Emask 0x1
我是 Hadoop 和虚拟机 (VM) 的新手。我想要一个有 4-5 个节点的 Hadoop 集群。我的理解是每个节点都是商品硬件(运行 Unix 的 PC)。我的想法是,是否可以在外部 HDD 上创
我是一名优秀的程序员,十分优秀!