每秒运行代码正好10000次

时间:2013-07-09 10:16:35

标签: c++ linux loops timer

我正在为我的程序编写测试代码。我需要代码每秒运行10000次。我的解决方案是:

for(int i = 0; i < 1000; ++i) {
  for(int j = 0; j < 10; ++j) {
  // do something here. Maybe ++k or some code else
  }
  usleep(1);
}

事实证明,时间超过1秒。所以我必须调整1000和100才能满足要求。这不是一个好习惯:当运行时间发生变化时,我必须更改代码。

有什么想法吗?

更新

该程序正在Linux上运行。我编写了一个msg队列。像往常一样,它有生产者和消费者。我想要全程测试。我需要测试代码发送几个msg,间隔很小(优选100μs)。

如果我在没有睡眠的情况下发送所有消息,则消息队列将满,并且在整个测试过程中都不起作用。

3 个答案:

答案 0 :(得分:5)

  

这不是一个好习惯:当运行时间发生变化时,我必须更改代码。

你是对的,时间循环从来都不是一个好主意,自20世纪80年代以来我甚至没有听说过有人写过它们。今天的高端和低端PC之间存在太大的差异,因此这是一个可行的策略。更不用说它在一台多任务机器上的脆弱性了。

您应该使用计时器。 API依赖于平台,但您没有告诉我们您的目标平台是什么。查看操作系统文档以获取更多详细信根据您需要的分辨率,可能有几种不同类型的计时器可供选择。

请记住,即使是相对高分辨率的计时器也不一定能保证毫秒级的精度,除非你在实时操作系统上运行。

然后就是为什么你需要在这个时间间隔内执行代码的问题。我想有可能是解决问题的更好方法,无论它是什么。但问题中没有提供足够的信息来猜测。

答案 1 :(得分:4)

如果要求是“限制”(即“不要用消息填充消息队列”,而不是“我想每X微秒发送一次”,那么我会建议这样的方法:

  1. 使用变量存储“上次发送的消息”和“自上次暂停后发送的号码”。
  2. 如果“上次发送的消息与现在之间的时间”超过X微秒,请重置“自上次暂停后发送的号码”。
  3. 如果自上次暂停后发送的号码&gt; Y,然后睡了一微秒。
  4. 您可能需要对X,Y和A参数进行一些调整 - 使它们成为常量,或者甚至通过命令行或配置文件更好地“运行时可配置”。

    这应该可以达到您想要的效果,而不会在您不需要时不必要地减慢速度(例如,如果您每隔一秒发送一条消息就不想暂停每100条消息,对吗?),这是一个各种事物的常见模式(网络数据包,来自自动电子邮件系统的电子邮件等等 - 只是略有不同的X,Y和A值)。

答案 2 :(得分:2)

我不知道,为什么你需要这样的测试。

无论如何,你可以使用游戏中使用的技术来获得稳定的FPS。对于每个帧,您可以测量计算时间,然后从期望值中减去它。

frame_time = 5ms
FPS = 50 -> 20ms/frame
sleep(20ms - 5ms)

但是我担心每秒10,000个循环,计算开销太大,1秒钟就能完成10k计算。