从Linux的HDD快速读取-奇怪的现象
Fast reading from HDD for Linux - strange phenomenon
[很抱歉造成混淆:最初的帖子标题中有"SSD"而不是"HDD",但我发现我在HDD上进行测试是偶然的,因为我访问了错误的安装点。在SSD上没有发生这种现象。不过,有趣的是,它发生在HDD上。]
我使用以下代码从给定数量的恒定大小的文件中循环读取。所有要读取的文件都存在,并且读取成功。
很明显,改变文件大小会对fMBPerSecond
产生影响,因为当读取小于页面大小的文件时,仍然会读取整个页面。然而,nNumberOfFiles
对fMBPerSecond
也有影响,这是我不理解的。显然,产生效果的不是nNumberOfFiles
本身,而是产品nNumberOfFiles * nFileSize
。
但为什么它会有效果呢?文件在循环中按顺序打开/读取/关闭。
我用nFileSize = 65536
进行了测试。当选择nNumberOfFiles = 10000
(或更小)时,我会得到一些关于fMBPerSecond = 500 MB/s
的信息。有了nNumberOfFiles = 20000
,我得到了一些关于fMBPerSecond = 100 MB/s
的东西,这是性能上的巨大损失。
哦,我应该提到的是,我在阅读之前通过执行来清除磁盘缓存
sudo sync
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
任何关于幕后发生的事情的想法都将受到欢迎。
佩德拉姆
void Read(int nFileSize, int nNumberOfFiles)
{
char szFilePath[4096];
unsigned char *pBuffer = new unsigned char[nFileSize];
Helpers::get_timer_value(true);
for (int i = 0; i < nNumberOfFiles; i++)
{
sprintf(szFilePath, "files/test_file_%.4i", i);
int f = open(szFilePath, O_RDONLY);
if (f)
{
if (read(f, pBuffer, (ssize_t) nFileSize) != (ssize_t) nFileSize)
printf("error: could not read file '%s'n", szFilePath);
close(f);
}
else
{
printf("error: could not open file for reading '%s'n", szFilePath);
}
}
const unsigned int t = Helpers::get_timer_value();
const float fMiliseconds = float(t) / 1000.0f;
const float fMilisecondsPerFile = fMiliseconds / float(nNumberOfFiles);
const float fBytesPerSecond = 1000.0f / fMilisecondsPerFile * float(nFileSize);
const float fMBPerSecond = fBytesPerSecond / 1024.0f / 1024.0f;
printf("t = %.8f ms / %.8i bytes - %.8f MB/sn", fMilisecondsPerFile,
nFileSize, fMBPerSecond);
delete [] pBuffer;
}
有几种SSD型号,尤其是更昂贵的数据中心型号,将内部DRAM缓存与(较慢的)持久NAND单元相结合。只要您读取的数据适合DRAM缓存,您就会得到更快的响应。
相关文章:
- 在C++/Linux中设置单调时钟的一些技巧
- Linux的Cpp上的计时器
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如何在linux终端中同时编译和运行c++代码
- 在Linux for Windows上编译C++代码时出错
- 如何找到锁定Linux futex的C++行
- 在linux上调试巨大的C++项目
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- c++方法参数只能在linux的发布模式下自行更改
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- 这里在 Linux 中具有"CreatePipe"和"CreateProcessW"功能吗?
- 函数在Windows或Linux上运行时表现不同
- 在Linux下捕获SIGKILL的C++程序
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- mysql C++ connector [mysql-connector-c++-8.0.19-linux-glibc2
- 这些是什么样的错误?即使我不在 Linux 上工作,我也遇到了 Linux 错误
- 从Linux的HDD快速读取-奇怪的现象