Ограничить время выполнения программы в Си (техника Монте-Карло) - PullRequest
0 голосов
/ 16 января 2011

Я работаю над проектом, у которого нет определенного алгоритма для решения с использованием языка Си.Я использую технику Монте-Карло для решения этой проблемы.И количество случайных догадок я хочу ограничить временем выполнения, указанным пользователем.Это означает, что я хочу в полной мере использовать ограничение времени выполнения, заданное пользователем (в качестве аргумента командной строки), чтобы сделать как можно больше случайных итераций.Могу ли я проверить истекшее время выполнения для условия цикла?

for(trials=0;execution_time<specified_time;trials++)

Если да, то как мне это сделать?Или, если есть и другой способ, это приветствуется.Спасибо.

PS Я использую Code Blocks 10.05 для кодирования и компилятора GNU.

Ответы [ 3 ]

2 голосов
/ 16 января 2011

Да, если у вас на компьютере достаточно мелкозернистые часы (и у вас есть).

  1. Запишите время начала симуляции.

  2. Для каждого обхода цикла найдите текущее время и соответствующую дельту между временем начала и временем.Если значение больше предела, остановитесь.

Если вы используете time() с его точностью в одну секунду, остерегайтесь эффектов квантования.Если пользователь сказал «1 секунда», вы могли бы в конечном итоге запустить в течение крошечной доли секунды, если ваша программа начиналась с T = N.999s, а вы остановились на T = (N + 1) .001s.Тот же эффект возможен для любого кванта, но поскольку микросекунды и наносекунды являются нормальными субсекундными гранулярностями, размер кванта перестает быть проблемой.

Известные мне функции часов с высоким разрешением:

  • clock_gettime () - POSIX (наносекунда)
  • gettimeofday () - POSIX (микросекунда)
  • раз () - Unix System V (CLK_TCK в секунду)
  • ftime () - Древний Unix (миллисекунда)
  • часы () - ISO C - (CLOCKS_PER_SEC)
  • время () - ISO C - (секунда)
2 голосов
/ 16 января 2011

Вы можете попробовать стандартную функцию clock (), которая возвращает количество внутренних тактов с момента запуска программы.См. Документацию этой функции для получения дополнительной информации.

0 голосов
/ 18 января 2011

Спасибо всем за ваши комментарии. Простой двухстрочный код сделал эту работу за меня:

time_t start_time = time(NULL);
while (((int)(time(NULL) - start_time)) < execution_time)
{
   /* ...... */
}
...