我想测量两个事件之间的持续时间,例如捕获不同时间点的CPU快照。 与
float
相乘后是否需要在这里对 1000000000L
进行强制转换?正确吗?
float get_elapsed(domain_info *dom) {
float temp;
temp = (float)((dom->t2.tv_sec - dom->t1.tv_sec) * 1000000000L + (dom->t2.tv_nsec - dom->t1.tv_nsec);
return temp;
}
我们不知道
typedef struct {} domain_info
是什么,并且表达式有不匹配的括号,因此无法编译。假设您的意思是:
#include <time.h>
typedef struct {
struct timespec t1;
struct timespec t2;
} domain_info;
float get_elapsed(domain_info *dom){
return (float)((dom->t2.tv_sec - dom->t1.tv_sec) * 1000000000L +(dom->t2.tv_nsec - dom->t1.tv_nsec));
}
int main(void) {
// ...
}
编译器会将表达式转换为
float
,因此您不需要显式转换或 temp
变量。
在我的系统上,tv_sec 是 64 位
long
,但如果是 32 位,则在 (dom->t2.tv_sec - dom->t1.tv_sec)
溢出之前只有几秒的增量。如果它是有符号类型,就像在我的系统上一样,这是未定义的行为。
在按因子
double
缩放 float
时,优先选择 tv_sec
而非 1000000000L
来提高 精度,并且还对
tv_nsec
的增量感兴趣。
long
够宽吗?
当 (dom->t2.tv_sec - dom->t1.tv_sec) * 1000000000L
和
long
为 32 位时,
time_t
会出现问题。
相反,要确保更广泛的数学。
<stdint.h>
提供至少形成所需位宽度的宏。
(dom->t2.tv_sec - dom->t1.tv_sec) * INT64_C(1000000000)
现在乘法将至少是 64 位。
有必要做演员吗
(?)float
通常使用的默认 FP 类型是
double
。如果需要 FP 返回类型,强制转换可以消除转换警告,这是一个很好的做法。
const
用于引用的数据,因为该函数不会更改它,因此允许调用代码将指针传递给 const
数据。double get_elapsed(const domain_info *dom){
return (double) (//
(dom->t2.tv_sec - dom->t1.tv_sec) * INT64_C(1000000000) + //
(dom->t2.tv_nsec - dom->t1.tv_nsec));
}