Расчетное время процессора C ++ отличается от фактического времени для решения модели MILP через Gurobi
Я решаю модель 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 и фактической продолжительностью (измеренной хронометром)?
Ответы
Это скорее вопрос C ++, поэтому вам лучше искать похожие вопросы в stackoverflow.
Распространенная проблема заключается в том, что clock () не является точным для коротких промежутков времени, поэтому вместо этого вам может потребоваться один из таймеров C ++ с высоким разрешением, как показано в ответе здесь .
EDIT: как прокомментировали user3680510 и Stradivari, это связано с использованием многопоточности, поскольку clock () измеряет время процессора . Указанный выше таймер C ++ (или time () C) будет работать правильно.
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();