Расчетное время процессора C ++ отличается от фактического времени для решения модели MILP через Gurobi

Dec 01 2020

Я решаю модель MILP на C ++ с помощью Gurobi 7.5.2. В частности, я определяю процессорное время моей программы на C ++ с помощью следующих команд:

  • clock_t start_time;
  • double elapsed_time;
  • start_time = часы ();
  • model.optimize ();
  • elapsed_time = (двойной) (часы () - время начала) / CLOCKS_PER_SEC;

Когда я сравниваю elapsed_time со средой выполнения Gurobi, среда выполнения Gurobi показывает фактическую продолжительность (измеряемую хронометром), но рассчитанное elapsed_time C ++ намного выше. Почему elapsed_time не совпадает с временем выполнения Gurobi и фактической продолжительностью (измеренной хронометром)?

Ответы

1 GabrielGouvine Dec 01 2020 at 18:15

Это скорее вопрос C ++, поэтому вам лучше искать похожие вопросы в stackoverflow.

Распространенная проблема заключается в том, что clock () не является точным для коротких промежутков времени, поэтому вместо этого вам может потребоваться один из таймеров C ++ с высоким разрешением, как показано в ответе здесь .

EDIT: как прокомментировали user3680510 и Stradivari, это связано с использованием многопоточности, поскольку clock () измеряет время процессора . Указанный выше таймер C ++ (или time () C) будет работать правильно.

1 NikosKazazakis Dec 01 2020 at 20:54

clock()измеряет процессорное время, а не реальное время. Для измерения реального времени в C ++ используйте:

auto start = std::chrono::steady_clock::now();

//do stuff

auto end = std::chrono::steady_clock::now();

auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();