O tempo de CPU calculado de C ++ é diferente do tempo real para resolver o modelo MILP via Gurobi
Estou resolvendo um modelo MILP em C ++ usando Gurobi 7.5.2. Mais especificamente, estou determinando o tempo de CPU do meu programa C ++ por meio dos seguintes comandos:
- clock_t start_time;
- double elapsed_time;
- start_time = clock ();
- model.optimize ();
- tempo decorrido = (duplo) (relógio () - hora_início) / CLOCKS_PER_SEC;
Quando eu comparo elapsed_time com o tempo de execução Gurobi, o tempo de execução Gurobi mostra a duração real (medida por um cronômetro), mas o elapsed_time calculado de C ++ é muito maior. Por que o elapsed_time não é o mesmo que o tempo de execução de Gurobi e a duração real (medida pelo cronômetro)?
Respostas
Esta é mais uma questão de C ++, então você deve procurar por questões semelhantes no stackoverflow.
Um problema comum é que clock () não é preciso por curtos períodos, então você pode querer um dos temporizadores C ++ de alta resolução, conforme mostrado em uma resposta aqui .
EDITAR: conforme comentado pelo usuário 3680510 e Stradivari, isso se deve ao uso de multithreading, já que clock () mede o tempo da CPU . O cronômetro do C ++ acima (ou o tempo do C ()) se comportará corretamente.
clock()
mede o tempo da CPU em vez do tempo real. Para medir o tempo real em C ++, use:
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();