如何在c ++中随机但非常少量地旋转for循环?

时间:2012-10-19 21:08:23

标签: c++ spinning

所以我基本上能够从多播环境中捕获一些数据包,然后将它们保存到文件中,然后将它们多播到需要多播数据的应用程序。我这样做是出于模拟目的。这是一个相对简单的工具,它在向gdb中运行的应用程序重放10个甚至50K数据包时很有用。我的重播循环如下所示:

for (size_t i = 0; i < packets_.size(); ++i)
    publisher_.publish(packets_[i].buf_, packets_[i].len_);

问题是,当packets_.size()大约100-200K(我永远不需要做更多)时,我似乎在有人在听时会丢失数据包。我猜这是因为它们在一次连续爆发中被重播。如果我尝试过这样的话:

for (size_t i = 0; i < packets_.size(); ++i)
{
    if (i % Y == 0) usleep(X);
    publisher_.publish(packets_[i].buf_, packets_[i].len_);
}

YX(例如1000/1000和许多其他组合)中的不同数量,但这不是很好。我的猜测是,如果我可以在很短的时间内忙于每次迭代的咀嚼周期,我就可以修补它。繁忙的咀嚼因为我不想屈服于其他进程因此花费的时间超过预期,但是数量非常少,甚至不是毫秒,因为这将需要200秒等待组播数据包。循环中对睡眠函数的重复调用似乎会让我大大减慢,这就是为什么我想知道一个简单的旋转方法可能是四分之一,五分之一,大约一毫秒左右(大致)? / p>

或者,如果有更好,更简单的方法来修补此用例?

2 个答案:

答案 0 :(得分:1)

以下功能可使系统“忙碌”一段时间:

static long slow( volatile long l ) {
   while ( l-- > 0 )  ;
   return l ;
}

取一些数字,比方说1000,然后运行slow( N ),同时计算在通话前后clock_t t = clock()需要多长时间。增加N,并重复相同的操作直到找到将使循环忙碌1秒的数字N.您现在将拥有一个功能和一个数字,使系统保持忙碌一秒钟。

希望它会有所帮助。

答案 1 :(得分:1)

这是一个忙碌的等待循环:

#include <chrono>

auto start = std::chrono::high_resolution_clock::now();
while(std::chrono::high_resolution_clock::now()-start < std::chrono::nanoseconds(500))
    ;

您可以等待的实际最短时间取决于实现的high_resolution_clock的分辨率。不幸的是,VS2012 does not have已经很好地实现了。也可以使用boost :: chrono,它会好得多。

如果您正在寻找实际随机的时间,可以使用<random>库:

#include <random>

std::mt19937 eng;
std::uniform_int_distribution<> dist(200,800);

auto delay = std::chrono::nanoseconds(dist(eng));

这是usleep的C ++ 11版本,因为当你想要放弃CPU时。

#include <thread>

std::this_thread::sleep_for(std::chrono::nanoseconds(500));