Я пытаюсь использовать Boost.Chrono для измерения времени процессора моего кода. Мой код C++ для этого приведен ниже. Проблема в том, что иногда я получаю отрицательную длительность. Это происходит, когда я использую «process_real_cpu_clock». Когда я использую «stable_clock», проблема не возникает. Некоторые из выходов я взял следующие:Отрицательная продолжительность с Boost Chrono's process_real_cpu_clock
время для 1-го РЕАЛИЗАЦИЯ: 360 мс
время для 2-го реализации: -3284.97 мс
время для 1-го РЕАЛИЗАЦИЯ: 360 мс
время для 2-й реализации: 1010 мс
время для 1-го РЕАЛИЗАЦИЯ: -3924.97 мс
время для 2-го реализации: 1010 мс
только второй один, как и ожидалось. Я предполагаю, что проблема заключалась в переполнении продолжительности, но в третьем выпуске время для первой реализации должно составлять около 1/3 времени для второго выполнения, тогда не должно быть переполнения, если я смогу увидеть время для второго выполнения. (Я использую подталкивание 1,54, и работать с Ubuntu на VirtualBox)
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <boost/chrono.hpp>
#include <boost/chrono/process_cpu_clocks.hpp>
int main() {
int x,y,result,runs;
srand(time(NULL));
runs=1e7;
boost::chrono::process_real_cpu_clock::time_point start, start2;
boost::chrono::process_real_cpu_clock::time_point end, end2;
start= boost::chrono::process_real_cpu_clock::now();
for (int i=0;i<runs;i++) {
x=rand() %100 +1;
y=rand() %100 +1;
auto dummy=x*y;
result=(result+dummy)%50;
}
end=boost::chrono::process_real_cpu_clock::now();
boost::chrono::process_real_cpu_clock::duration diff=end-start;
start2= boost::chrono::process_real_cpu_clock::now();
for (int i=0;i<(3*runs);i++) {
x=rand() %100 +1;
y=rand() %100 +1;
auto dummy=x*y;
result=(result+dummy)%50;
}
end2=boost::chrono::process_real_cpu_clock::now();
boost::chrono::process_real_cpu_clock::duration diff2=end2-start2;
std::cout << "time for 1st implemention:"<<boost::chrono::duration <double, boost::milli> (diff).count()<< " ns" << std::endl;
std::cout << "time for 2nd implementation:"<<boost::chrono::duration <double, boost::milli> (diff2).count()<< " ns" << std::endl;
return 0;
}
Вы уверены, что код является кодом? 'start1' и' end1' здесь не используются. Правильный факторинг кода позволяет избежать таких ситуаций, связанных с ошибкой. Я добавил такое решение, основанное на факторе, на мой ответ (он может быть слишком общим для вашего вкуса). – sehe
Вы правы. 'start1' и' end1' были там из предыдущей версии кода. Я починил это. – oicrisah