时间以微秒为单位询问,但以秒为单位
Time asked in microseconds but got in seconds
我在读取 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()。它没有解决我的问题...
大家有什么建议吗?
感谢您的帮助。
对于C++11方式,检查bames53的answer。
这给出了以纳秒为单位的时间。在 Ubuntu、C++ 中,您需要将 -lrt 添加到您 link 的库列表中。示例(在主文件中):
mm: 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";
然后转换为女士
我从我的示例中得出这个 here。
另一种有趣的方法,可能与您想要的有点不一样:
#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;
}
Source
在 C++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);
我在读取 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()。它没有解决我的问题...
大家有什么建议吗?
感谢您的帮助。
对于C++11方式,检查bames53的answer。
这给出了以纳秒为单位的时间。在 Ubuntu、C++ 中,您需要将 -lrt 添加到您 link 的库列表中。示例(在主文件中):
mm: 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";
然后转换为女士
我从我的示例中得出这个 here。
另一种有趣的方法,可能与您想要的有点不一样:
#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;
}
Source
在 C++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);