clock () хорошо работает в отладочной версии, но не будет работать в выпуске (C VS2010)

#c #timer #release #clock

#c #таймер #выпуск #часы

Вопрос:

Это мой код:

 // Start performance test clock
assert((start=clock())!=-1);

// Some reading and writing methods

// Get stop time
stop = clock();

cout << stop << endl;

// Calculate operation time
double result = (double)(stop-start)/CLOCKS_PER_SEC;

// Print result
cout << "--> Finished analysing in " << result << "s" << endl;
  

Он отлично работает, когда я отлаживаю свою программу, но когда я запускаю релизную версию,
stop получает гораздо меньшее значение, чем start, и результатом является отрицательное число.

Есть идеи?

Комментарии:

1. Выпускная версия может быть сильно оптимизирована, и, следовательно, это занимает гораздо меньше времени, чем в отладочной версии. Обычно отладочные версии не используют оптимизацию. Что произойдет, если вы отключите оптимизацию в конфигурации выпуска (обязательно повторно включите ее впоследствии)?

2. @WTP: Я сомневаюсь, что какой-либо компилятор может оптимизировать код настолько хорошо, что он может перемещаться во времени! Проблема заключалась не просто в получении меньшего значения времени, но и в получении отрицательного значения.

3. Кроме того: рассмотрите возможность использования библиотеки таймера повышения .

Ответ №1:

Назначение start не должно быть в assert инструкции. assert обычно не используется в сборках релизов. Таким образом, в отладочной сборке будет выполняться оператор start=clock() , но в сборке выпуска этого не будет. Таким образом, возможно (в зависимости от более раннего кода и объявления start ), что он не инициализирован. Обычно желательно избегать использования assert инструкций, которые имеют побочные эффекты; это может привести к незначительным различиям / ошибкам между сборками debug и release.

Возможно, было бы лучше написать это так:

 start = clock();
assert(start != -1);