gpt4 book ai didi

c++ - 连续写入导致仅访问磁盘一次

转载 作者:太空狗 更新时间:2023-10-29 21:16:13 26 4
gpt4 key购买 nike

在给定的学校练习中,我被要求测量处理器的运行时间。其中,有人要求我测量访问磁盘所需的时间,并强烈建议我对文件使用函数。

因此,我想到了这个简单的“解决方案”:

/* Time measurement function for accessing the disk.
returns time in nano-seconds upon success,
and -1 upon failure.
*/
double osm_disk_time(unsigned int iterations)
{
// Check for illegal input
iterations = (iterations == ILLEGAL_ITER_NUM) ? DEFAULT_ITER_NUM:iterations;

// Start measuring.
startTimeSuccess = gettimeofday(&timeStart, NULL);
for (unsigned int i = 0; i < iterations/ LOOP_FACTOR; ++i) {
//operation. (loop unrolling): Write a char and flush memory

if (fputs(LETTER_TO_WRITE, pFile) < SUCCESS || fflush(pFile) < SUCCESS)
{
return FAILURE;
}

if (fputs(LETTER_TO_WRITE, pFile) < SUCCESS || fflush(pFile) < SUCCESS)
{
return FAILURE;
}

if (fputs(LETTER_TO_WRITE, pFile) < SUCCESS || fflush(pFile) < SUCCESS)
{
return FAILURE;
}
}
// Stop measuring.
endTimeSuccess = gettimeofday(&timeEnd, NULL);

return returnValueChecker(startTimeSuccess, endTimeSuccess, iterations);
}

问题是我的测量时间明显低于平均水平。根据我所做的一些研究,我了解到多次“写入”可能只访问磁盘一次,这可能是我的测量不准确的原因。我不明白为什么会这样,我该怎么做才能解决这个问题。

(PS:returnValueChecker() 只是检查返回值)。

最佳答案

涉及多个级别的缓存。第一个在图书馆本身。您可以使用 fflush 来缓解它。第二个是在操作系统中,称为页面缓存。还有第三个 - 磁盘驱动器本身的硬件缓存。

为了避免缓存效应,可以采用以下几种策略:

  • 使用比可用 RAM 容量大得多的文件。这样就无法将整个文件缓存在 RAM 中。

  • 使用特殊调用进行直接磁盘访问(在操作系统文档中查找),或者像处理库缓存一样刷新操作系统缓存。例如 POSIX 的 fsync 调用。

  • 您很可能对随机访问时间感兴趣。所以创建一个大文件(>RAM)然后在随机位置读/写。

关于c++ - 连续写入导致仅访问磁盘一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35745340/

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