O tempo de CPU calculado de C ++ é diferente do tempo real para resolver o modelo MILP via Gurobi

Dec 01 2020

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

1 GabrielGouvine Dec 01 2020 at 18:15

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.

1 NikosKazazakis Dec 01 2020 at 20:54

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