Die berechnete CPU-Zeit von C ++ unterscheidet sich von der tatsächlichen Zeit zum Lösen des MILP-Modells über Gurobi
Ich löse ein MILP-Modell in C ++ mit Gurobi 7.5.2. Insbesondere bestimme ich die CPU-Zeit meines C ++ - Programms über die folgenden Befehle:
- clock_t start_time;
- double elapsed_time;
- start_time = clock ();
- model.optimize ();
- elapsed_time = (double) (clock () - start_time) / CLOCKS_PER_SEC;
Wenn ich die verstrichene_Zeit mit der Gurobi-Laufzeit vergleiche, zeigt die Gurobi-Laufzeit die tatsächliche Dauer (gemessen mit einem Chronometer) an, aber die berechnete verstrichene_Zeit von C ++ ist viel höher. Warum ist die verstrichene Zeit nicht gleich der Gurobi-Laufzeit und der tatsächlichen Dauer (gemessen mit dem Chronometer)?
Antworten
Dies ist eher eine C ++ - Frage, daher sollten Sie lieber nach ähnlichen Fragen zum Stackoverflow suchen.
Ein häufiges Problem ist, dass clock () für kurze Zeit nicht genau ist. Daher möchten Sie möglicherweise stattdessen einen der hochauflösenden C ++ - Timer, wie in einer Antwort hier gezeigt .
BEARBEITEN: Wie von user3680510 und Stradivari kommentiert, ist dies auf die Verwendung von Multithreading zurückzuführen, da clock () die CPU-Zeit misst . Der obige C ++ - Timer (oder Cs time ()) verhält sich korrekt.
clock()
Misst die CPU-Zeit anstelle von Echtzeit. Um Echtzeit in C ++ zu messen, verwenden Sie:
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();