Obliczony czas procesora C ++ różni się od rzeczywistego czasu rozwiązania modelu MILP za pośrednictwem Gurobi

Dec 01 2020

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

1 GabrielGouvine Dec 01 2020 at 18:15

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.

1 NikosKazazakis Dec 01 2020 at 20:54

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();