【问题标题】:C fwrite calculating elapsed TimeC fwrite 计算经过的时间
【发布时间】:2013-01-24 01:07:54
【问题描述】:

我有一个问题。 我实际上想大致了解一下对驱动器进行 fwrite 需要多长时间。

当我执行以下操作时:

clock_t begin = clock();
unsigned long long size_t = fwrite(send, 1, transfer_size*sizeof(unsigned long long), wpFile);
clock_t end = clock();
double long elapsed_secs = double long(end - begin) / CLOCKS_PER_SEC;

不幸的是,对于不同的传输大小,我没有得到任何不同的结果!!!

我的猜测是 clock_t ,一旦它发出一个 fwrite 命令,它会停止它的测量,当我已经完成 fwrite 时它又回来了。 我确实得到了几乎相同的度量,无论我的传输大小是 32KB 字节还是 16MB ! 我确实期待看到巨大的差异。 我真的不想要确切的真实时间测量(当然很高兴知道);而我所关心的只是看看我是在做 KB 传输还是 MB 传输在时间上有所不同。

有没有人知道任何其他功能可以让我粗略测量 fwrite 功能所用的实际时间?

【问题讨论】:

  • 写入 16MB 可能需要不到 1 秒的时间,特别是如果您的操作系统正在执行任何形式的磁盘缓存...
  • 您的fwrite 调用是否可能是异步的?快速的 Google 搜索表明可能是这样,并且可能需要调用 fflush 以确保在您转到下一个功能(停止计时器)之前实际写入了所有数据。
  • @nosuchthingasstars fflush 实际上是否强制将脏页写入磁盘?据我了解,flush 仅保证更改对其他读者可见。操作系统对其页面缓存的处理应该不受影响。我错了吗?
  • 来自 cplusplus.com 文档:“如果给定流已打开以进行写入(或者如果它已打开以进行更新并且最后的 i/o 操作是输出操作)其输出缓冲区中的任何未写入数据被写入文件。”至于操作系统具体做什么,老实说我不确定。

标签: c++ fwrite


【解决方案1】:

问题是(在大多数操作系统上)所有对磁盘的写入都首先写入内存缓存。只有当这些缓存页面变得太旧(通常为 1 秒的数量级)时,它们才会真正写入磁盘。

对内存缓存的写入非常快。如果您需要对实际磁盘写入的速度进行基准测试,则必须先同步缓存。

一种可行的方法: syncfs() 来自 unistd.hman 2 sync 说这个函数不一定要等待同步发生,而是“从 Linux 1.3 开始它确实在等待”。

编辑:您没有说您使用的是 Windows :) 我对它不是很熟悉,但是在 WINAPI 中快速谷歌搜索出现了FILE_FLAG_NO_BUFFERINGFlushFileBuffers。看hereherehere

【讨论】:

  • 磁盘也有缓存。所以需要考虑到这一点;以及启动并找到目标盘片和扇区的时间。
  • 另外,考虑在后台运行的程序。例如,Adobe Acrobat 可能会检查升级以及 Windows。也许您可能有网络 ping 或音乐播放。
  • 看起来同步是一个系统调用。是吗?有 c++ 同步功能吗?什么是windows的同步功能。看起来同步是一个unix系统调用!
  • @Rudy01 我对 Windows 了解不多,但请查看我添加到答案中的链接。
猜你喜欢
  • 1970-01-01
  • 2016-04-25
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多