Le temps CPU calculé de C ++ est différent du temps réel pour résoudre le modèle MILP via Gurobi

Dec 01 2020

Je résous un modèle MILP en C ++ en utilisant Gurobi 7.5.2. Plus précisément, je détermine le temps CPU de mon programme C ++ via les commandes suivantes:

  • clock_t heure_début;
  • double elapsed_time;
  • heure_début = horloge ();
  • model.optimize ();
  • elapsed_time = (double) (clock () - start_time) / CLOCKS_PER_SEC;

Lorsque je compare elapsed_time avec le runtime Gurobi, le runtime Gurobi affiche la durée réelle (mesurée par un chronomètre) mais le elapsed_time calculé de C ++ est bien plus élevé. Pourquoi elapsed_time n'est-il pas le même que le runtime Gurobi et la durée réelle (mesurée par le chronomètre)?

Réponses

1 GabrielGouvine Dec 01 2020 at 18:15

Il s'agit davantage d'une question C ++, vous devriez donc plutôt rechercher des questions similaires sur stackoverflow.

Un problème courant est que clock () n'est pas précis pour de courtes durées, vous pouvez donc vouloir l'un des minuteries C ++ haute résolution à la place, comme indiqué dans une réponse ici .

EDIT: comme commenté par user3680510 et Stradivari, cela est dû à l'utilisation du multithreading, car clock () mesure le temps CPU . La minuterie C ++ ci-dessus (ou l'heure de C ()) se comportera correctement.

1 NikosKazazakis Dec 01 2020 at 20:54

clock()mesure le temps CPU au lieu du temps réel. Pour mesurer le temps réel en C ++, utilisez:

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