Время просили в микросекундах, но получили в секундах

0

У меня возникла проблема, читая системное время в Ubuntu. Я пытаюсь получить разницу между двумя переменными ptime.

Это мое выражение:

#include "boost/date_time/posix_time/posix_time.hpp"

boost::posix_time::ptime now  = boost::posix_time::microsec_clock::universal_time();
boost::posix_time::ptime last_time = now;
boost::posix_time::time_duration dt;
...

Через некоторое время я обновляю переменную now и создаю разницу

now  = boost::posix_time::second_clock::universal_time();
dt = last_time - now;

Проблема в том, что я хочу работать в миллисекундном разрешении в моем проекте, поэтому я делю время, которое я получаю на 1000 (после преобразования времени в микросекунды, как показано ниже).

printf("%f", (double)dt.total_microseconds());

Проблема в том, что я получил только значения во втором разрешении. Я уже пробовал local_time() вместо universal_time(). Это не решило мою проблему...

Есть ли у вас какие-либо предложения?

Спасибо вам за помощь.

Теги:
posix

2 ответа

1
Лучший ответ

Для C++ 11 способов, проверьте ответ на bames53.


Это дает время в наносекундах. В Ubuntu, C++, вам нужно добавить -lrt в список библиотек, на которые вы ссылаетесь. Пример (в основном файле):

мм: main.cpp memory_manager.cc

g++ -Wextra -Wall -Wreorder -o mm main.cpp memory_manager.cc -lrt

#include <cstdint> // C++11. Use #include <stdint.h> instead
#include <ctime>

int64_t timespecDiff(struct timespec *timeA_p, struct timespec *timeB_p)
{
  return (((int64_t)timeA_p->tv_sec * 1000000000) + timeA_p->tv_nsec) -
         (((int64_t)timeB_p->tv_sec * 1000000000) + timeB_p->tv_nsec);
}

struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);

/* Code to be measured */

clock_gettime(CLOCK_MONOTONIC, &end);
int64_t time;
time = timespecDiff(&end, &start);
std::cout<<"Time: " << time << " ns\n";

Затем преобразуйте в ms.

Я иду это из моего примера здесь.


Еще один интересный подход, который может быть немного зависеть от того, что вы хотите:

#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
    struct timeval start, end;

    long mtime, seconds, useconds;    

    gettimeofday(&start, NULL);
    usleep(2000);
    gettimeofday(&end, NULL);

    seconds  = end.tv_sec  - start.tv_sec;
    useconds = end.tv_usec - start.tv_usec;

    mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;

    printf("Elapsed time: %ld milliseconds\n", mtime);

    return 0;
}

Источник

  • 0
    Спасибо! Это решает все проблемы, которые я получил!
  • 0
    Добро пожаловать @bdvd! Убедитесь, что вы проверили новую ссылку, которую я только что добавил, о способе выполнения C ++ 11!
2

в С++ 11 все может быть сделано довольно легко.

#include <chrono>
using std::chrono::high_resolution_clock;
using std::chrono::milliseconds;
using std::chrono::nanoseconds;

auto t0 = high_resolution_clock::now();

// do something here ...

auto t1 = high_resolution_clock::now();
// get miliseconds result.
milliseconds total_milliseconds = std::chrono::duration_cast<milliseconds>(t1 - t0);
// get nanoseconds result.
nanoseconds total_nanoseconds = std::chrono::duration_cast<nanoseconds>(t1 - t0);
  • 0
    Конечно, при использовании chrono хорошо придерживаться универсального кода и избегать выбора типа фиксированной длительности как можно дольше. Просто используйте auto dt = t1 - t0; вместо duration_cast .
  • 0
    @ bames53 с auto , как вы собираетесь указывать миллисекунды тогда?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню