Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
7年前关闭。
Improve this question
[对混淆感到抱歉:最初的帖子标题中带有“SSD”而不是“HDD”,但是我发现由于访问错误的安装点而偶然对HDD进行了测试。在SSD上没有发生此现象。仍然很有趣,尽管它发生在HDD上。]
我正在使用以下代码从给定数量的恒定大小的文件中循环读取。所有要读取的文件均已存在,并且读取成功。
显然,改变文件大小会影响
但是为什么要起作用呢?依次循环打开/读取/关闭文件。
我测试了
哦,我应该提一下,我在执行读取操作之前先清除了磁盘缓存:
任何想法幕后发生的事情都将受到欢迎。
皮德拉姆
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
7年前关闭。
Improve this question
[对混淆感到抱歉:最初的帖子标题中带有“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/s\n", fMilisecondsPerFile,
nFileSize, fMBPerSecond);
delete [] pBuffer;
}
最佳答案
有几种SSD模型,尤其是较昂贵的数据中心模型,将内部DRAM缓存与(较慢的)持久NAND单元结合在一起。只要读取的数据适合DRAM缓存,您就会获得更快的响应。