- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
由于 Mac OS X 不支持 get time,我在这里找到了一个使用 clock_gettime 基金的可移植方式的要点:
void current_utc_time(struct timespec *ts) {
#ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time
clock_serv_t cclock;
mach_timespec_t mts;
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
clock_get_time(cclock, &mts);
mach_port_deallocate(mach_task_self(), cclock);
ts->tv_sec = mts.tv_sec;
ts->tv_nsec = mts.tv_nsec;
#else
clock_gettime(CLOCK_REALTIME, ts);
#endif
}
这样使用
struct timespec requestStart;
current_utc_time(&requestStart);
printf("start: s: %lu\n", requestStart.tv_sec);
printf("start: ns: %lu\n", requestStart.tv_nsec);
start: s: 1435988139
start: ns: 202015000
我正在尝试从此代码中获取秒和毫秒值,这是从纳秒值中获取毫秒值的正确方法吗?
printf("total: ms: %lu\n", (requestStart.tv_nsec - requestEnd.tv_nsec) / (unsigned long)1000000);
如果是这样,我如何获得秒值?如果不是,我如何获得毫秒和秒值?
编辑作为对第一条评论的回应,我主要是在寻找一种使代码尽可能可移植的方法。
最佳答案
如果您想要可移植性,只需使用gettimeofday
。这应该无处不在。 clock_gettime
似乎是 Linux 特定的一个相对较新的 Posix 介绍。
关于转换:struct timeval
(由 gettimeofday
和其他旧函数使用)使用微秒。较新的 struct timespec
使用纳秒。因此,要来回转换,您需要乘以或除以 1000。
当计算差异时,你必须担心进位/溢出,所以你的表达式
(requestStart.tv_nsec - requestEnd.tv_nsec) / (unsigned long)1000000
不正确的原因有两个:差异可能会出现负数(也就是说,如果时间从 123.456 变为 124.321),并且您将其缩放得太多。
当我为一些操作计时时,我通常会这样做:
struct timeval before, after, elapsed;
gettimeofday(&before, NULL);
sleep(1);
gettimeofday(&after, NULL);
elapsed.tv_sec = after.tv_sec - before.tv_sec;
if(after.tv_usec >= before.tv_usec)
elapsed.tv_usec = after.tv_usec - before.tv_usec;
else {
elapsed.tv_sec--;
elapsed.tv_usec = 1000000 + after.tv_usec - before.tv_usec;
}
printf("elapsed: %d.%06ld\n", (int)elapsed.tv_sec, (long)elapsed.tv_usec);
如果我想要一个 struct timespec
(使用纳秒),我会乘以 1000:
struct timespec elapsed2;
elapsed2.tv_sec = elapsed.tv_sec;
elapsed2.tv_nsec = elapsed.tv_usec * 1000;
printf("elapsed: %d.%09ld\n", (int)elapsed2.tv_sec, (long)elapsed2.tv_nsec);
要从 struct timespec
转换回 struct timeval
,我会除以 1000:
struct timeval elapsed3;
elapsed3.tv_sec = elapsed2.tv_sec;
elapsed3.tv_usec = elapsed2.tv_nsec / 1000;
另一个有用的是将秒和亚秒作为 float 提取出来:
double e = (double)elapsed.tv_sec + elapsed.tv_usec / 1e6;
double e2 = (double)elapsed2.tv_sec + elapsed2.tv_nsec / 1e9;
printf("float: %f %f\n", e, e2);
(事实证明,在编写此类代码时可能会有微妙之处,具体取决于 tv_sec
和 tv_usec
或 tv_nsec
,以及您的编译器可能选择给您的“有用”警告。参见 this question。)
关于c - 获取时间的便携方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31217321/
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 10年前关
我想做的是使 sbt 可移植,至少可以在不同的 Windows 机器之间移植,这样我的 sbt 插件、设置、ivy repo 等就不必在每台计算机上重新设置。 我的方法是把 sbt.bat , sbt
我似乎看到很多答案有人建议使用 生成随机数,通常伴随着这样的代码: std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_d
我正在使用 perl(希望它不会影响任何东西),但我需要知道如何为连接操作设置超时。问题是我不能永远等待连接操作的发生。如果它没有在几秒钟内发生,我宁愿放弃并继续前进。 socket(my $sock
是否有一种简单、可移植的方式(至少是 win32,linux)将 UTF-16 转换为 UTF-8 并返回?最好使用 boost。 谢谢你的帮助,托拜厄斯 最佳答案 两者都是libiconv和 icu
我将飞往澳大利亚(飞行约 15 小时),我想在飞机上继续我当前的项目。 我的项目(CakePHP 框架上的网站)需要一个 LAMP 包,所以我正在寻找一种非常便携、价格合理的设备,可以安装 LAMP,
我想在我们的编程课上在我们学校的计算机(在 Windows 下)上运行 python3。我在家里(使用 Windows)将 python 3.1 安装到 USB 闪存驱动器上,并将其带到学校。但是,它
出于教学目的,我正在寻找适用于 Mac、Windows 和可能的 Linux 的独立 PHP 二进制文件。 计划将二进制文件作为单个文件分发给学生,用于测试 PHP 脚本,而无需安装完整的 Web 服
关于好的 Git GUI 的任何建议。理想情况下应具有以下特征: 没有太多限制,即可以支持相对复杂的功能,例如 rebase ,没有-ff 以“学习模式”显示正在执行的 Git 命令,尤其是具有很多选
我是一名优秀的程序员,十分优秀!