【问题标题】:Getting Inconsistent results with clock_gettime()使用 clock_gettime() 得到不一致的结果
【发布时间】:2015-09-08 12:01:59
【问题描述】:

我目前正在处理共享内存,我想计算花费的时间 thread1 要写入,thread2 从共享内存中读取。为此我使用了:

 clock_gettime(CLOCK_REALTIME,&start)

在线程 1 中,并在从线程 2 读取之后。我又打电话了:

 clock_gettime(CLOCK_REALTIME,&end) 

阅读和写作所用的时间可以通过以下方式计算:

 dt = (double) (end.tv_sec - start.tv_sec) +
((double) (end.tv_nsec - start.tv_nsec) / 1000000000.0);

但是每次我运行程序时,我都会得到不同的结果。 我做错了什么?

【问题讨论】:

  • 当您说“不同的结果”时,您能说得更具体一点吗?你得到什么范围?而且由于您使用挂钟,您知道 Linux 是一个多任务操作系统内核,它可能会暂停您的进程并让其他进程工作,并且您无法真正控制您的进程可能执行多长时间或多少次暂停,那当然会扭曲你的结果。为了得到更好的结果,将操作进行数千次(甚至数百万次),并计算平均时间。
  • 感谢 Joachim,我们正在使用基于优先级的抢先调度。除了中断假设,最高优先级线程将被调度。有时我们得到 0.000367 秒,有时是 0.004442 秒,我认为这个余量很高。如果我错了,请纠正我
  • 系统中是否有其他同等或更高优先级的进程在运行?如果不是,那么是的,这似乎是一个很大的范围。
  • clock_gettime() 中的开销(必须发出序列化指令)可能比单个写入/读取共享内存的时间大一个数量级。尝试在两个进程之间对数据进行 ping-ponding 数千次,然后测量 那个(然后除以次数)。
  • 另外,对于这样的应用程序,您可能应该使用CLOCK_MONOTONIC 而不是CLOCK_REALTIME - 请参阅stackoverflow.com/questions/3523442/…linux.die.net/man

标签: c pthreads shared-memory


【解决方案1】:

我以前使用过这种测量方法,您没有做错任何事。即使您的日程安排正确,您的输出也会始终波动。

如果线程没有被另一个进程中断,我以前的开销大约是 250 微秒,但我想这也非常依赖于 CPU 能力。

对于开销:尝试用空主体测量数百/数千次,检查最低(最少中断)输出以检查开销。

对于您的结果:尝试相同并再次取最低值,这样您就可以接近您正在寻找的实际值。请记住,单次读取和写入可能无法快速测量。

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2021-07-17
    • 2014-12-18
    相关资源
    最近更新 更多