我正在为我的程序编写测试代码。我需要代码每秒运行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)。
如果我在没有睡眠的情况下发送所有消息,则消息队列将满,并且在整个测试过程中都不起作用。
答案 0 :(得分:5)
这不是一个好习惯:当运行时间发生变化时,我必须更改代码。
你是对的,时间循环从来都不是一个好主意,自20世纪80年代以来我甚至没有听说过有人写过它们。今天的高端和低端PC之间存在太大的差异,因此这是一个可行的策略。更不用说它在一台多任务机器上的脆弱性了。
您应该使用计时器。 API依赖于平台,但您没有告诉我们您的目标平台是什么。查看操作系统文档以获取更多详细信根据您需要的分辨率,可能有几种不同类型的计时器可供选择。
请记住,即使是相对高分辨率的计时器也不一定能保证毫秒级的精度,除非你在实时操作系统上运行。
然后就是为什么你需要在这个时间间隔内执行代码的问题。我想有可能是解决问题的更好方法,无论它是什么。但问题中没有提供足够的信息来猜测。
答案 1 :(得分:4)
如果要求是“限制”(即“不要用消息填充消息队列”,而不是“我想每X微秒发送一次”,那么我会建议这样的方法:
您可能需要对X,Y和A参数进行一些调整 - 使它们成为常量,或者甚至通过命令行或配置文件更好地“运行时可配置”。
这应该可以达到您想要的效果,而不会在您不需要时不必要地减慢速度(例如,如果您每隔一秒发送一条消息就不想暂停每100条消息,对吗?),这是一个各种事物的常见模式(网络数据包,来自自动电子邮件系统的电子邮件等等 - 只是略有不同的X,Y和A值)。
答案 2 :(得分:2)
我不知道,为什么你需要这样的测试。
无论如何,你可以使用游戏中使用的技术来获得稳定的FPS。对于每个帧,您可以测量计算时间,然后从期望值中减去它。
frame_time = 5ms
FPS = 50 -> 20ms/frame
sleep(20ms - 5ms)
但是我担心每秒10,000个循环,计算开销太大,1秒钟就能完成10k计算。