Obliczony czas procesora C ++ różni się od rzeczywistego czasu rozwiązania modelu MILP za pośrednictwem Gurobi
Rozwiązuję model MILP w C ++ przy użyciu Gurobi 7.5.2. Dokładniej, określam czas procesora mojego programu C ++ za pomocą następujących poleceń:
- clock_t start_time;
- double elapsed_time;
- start_time = clock ();
- model.optimize ();
- elapsed_time = (double) (clock () - start_time) / CLOCKS_PER_SEC;
Kiedy porównuję czas elapsed_time ze środowiskiem wykonawczym Gurobi, środowisko wykonawcze Gurobi pokazuje rzeczywisty czas trwania (mierzony chronometrem), ale obliczony czas elapsed_time w C ++ jest znacznie wyższy. Dlaczego elapsed_time nie jest tym samym, co czas wykonywania Gurobi i rzeczywisty czas trwania (mierzony przez chronometr)?
Odpowiedzi
Jest to bardziej pytanie C ++, więc powinieneś raczej szukać podobnych pytań na stackoverflow.
Częstym problemem jest to, że funkcja clock () nie jest dokładna przez krótki czas, więc możesz zamiast tego użyć jednego z timerów C ++ o wysokiej rozdzielczości, jak pokazano w odpowiedzi tutaj .
EDYCJA: jak skomentowali user3680510 i Stradivari, jest to spowodowane użyciem wielowątkowości, ponieważ zegar () mierzy czas procesora . Zegar C ++ powyżej (lub time () w języku C) będzie działał poprawnie.
clock()
mierzy czas procesora zamiast czasu rzeczywistego. W celu pomiaru czasu rzeczywistego w C ++ użyj:
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();