3

[抱歉造成混淆:原帖的标题中使用的是“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;
}
4

1 回答 1

1

有几种 SSD 模型,尤其是更昂贵的数据中心模型,它们将内部 DRAM 缓存与(较慢的)持久性 NAND 单元相结合。只要您读取的数据适合 DRAM 缓存,您就会获得更快的响应。

于 2013-12-18T19:14:41.723 回答