Как я могу вращаться в цикле for для случайного, но очень небольшого количества времени в C ++?

Таким образом, у меня есть возможность захватывать некоторые пакеты из многоадресной среды, и я сохраняю их в файл, а затем отправляю их многоадресно в приложения, которые ожидают многоадресные данные. Я делаю это для целей моделирования. Это относительно простой инструмент, и он хорошо мне пригодился при воспроизведении пакетов по 10 или даже 50 КБ в приложение, работающее в GDB. Мой цикл воспроизведения выглядит так:

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

и проблема в том, что когда packet_.size () составляет около 100-200 КБ (мне никогда не нужно было бы делать больше, чем это), я, кажется, испытываю потерю пакетов, когда кто-то слушает. Я предполагаю, что это потому, что они воспроизводятся в одном непрерывном пакете. Если бы я попробовал такие вещи, как:

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

на разные суммы в Y а также X (например, 1000/1000 и многие другие комбинации), но это не очень хорошо работает. Я предположил, что я мог бы исправить это, если бы я мог загружать циклы жевания на каждой итерации в течение очень небольшого промежутка времени. Занят, потому что я не хочу уступать другим процессам и поэтому занимаю больше времени, чем ожидалось, но очень маленькое количество, даже не миллисекунду, потому что это потребовало бы 200 секунд ожидания многоадресной рассылки пакетов. Похоже, что повторяющиеся вызовы в цикле для функции сна значительно уступают и замедляют меня, поэтому мне было интересно, каким будет простой способ вращаться, возможно, на четверть, пятую, половину или около того миллисекунды (примерно)?

Или если бы был лучший и простой способ исправить это для этого варианта использования?

0

Решение

Приведенная ниже функция удерживает систему «занятой» в течение некоторого неопределенного времени:

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

Возьмите некоторое число, скажем, 1000, а затем запустите slow( N ) и в то же время посчитайте, сколько времени заняло clock_t t = clock() до и после звонка. Увеличивайте N и повторяйте ту же операцию, пока не найдете число 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 к сожалению не имеет достойной реализации пока нет. 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, когда вы хотите отказаться от процессора.

#include <thread>

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

По вопросам рекламы [email protected]