-2

我正在为我的程序编写测试代码。我需要代码每秒运行 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 上运行。我编写了一个消息队列。像往常一样,它有生产者和消费者。我想全程测试。我需要测试代码以很小的间隔发送几个消息(首选 100µs)。

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

4

3 回答 3

5

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

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

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

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

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

于 2013-07-09T10:23:46.570 回答
4

如果要求是“节流”(即“不要用消息淹没消息队列”,而不是“我想每 X 微秒发送一个”,那么我会建议这样的方法:

  1. 使用变量来存储“上次发送的消息”和“自上次暂停以来发送的号码”。
  2. 如果“上次发送消息与现在之间的时间”超过 X 微秒,则重置“自上次暂停后发送的数量”。
  3. 如果自上次暂停后发送的数字 > Y,则休眠 A 微秒。

您可能需要对 X、Y 和 A 参数进行一些调整——使它们成为常量,或者通过命令行或配置文件更好地“运行时可配置”。

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

于 2013-07-09T10:55:51.513 回答
2

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

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

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

但是恐怕每秒10000次循环,计算开销会太大,1秒内装不下10k次计算。

于 2013-07-09T10:24:01.137 回答