一段有趣的代码
利用宏统计代码块占用时间,利用了几个的有趣语法,代码如下:
uint64_t get_time_us()
{
struct timeval t_now;
gettimeofday(&t_now, NULL);
uint64_t u64_now = t_now.tv_sec * 1000000L + t_now.tv_usec;
return u64_now;
}
#define clock_count(x) do{\
static __thread uint64_t __clk_last = 0;\
static __thread uint64_t __clk_num;\
uint64_t u64_stime = get_time_us();\
if(0 == __clk_last) __clk_last = u64_stime;\
x;\
uint64_t u64_etime = get_time_us();\
__clk_num += (u64_etime - u64_stime);\
if(1000000 < u64_etime - __clk_last)\
{\
printf("#%lu, %s@%dL: %lu===>%lu us!\n", pthread_self(), __FUNCTION__, __LINE__, u64_etime - __clk_last, __clk_num);\
__clk_last = u64_etime;\
__clk_num = 0;\
}\
}while(0)
int main(int argc, char **argv)
{
for(int i = 0; i < 30000; i++)
{
usleep(50);
clock_count(
usleep(50);
);
}
return 0;
}
上述代码有趣的地方:
- 函数调用表达式可以作为带参数宏的实参,跟函数有很大区别了,加深了体会,宏真的是傻傻的展开代码
- 代码块内定义变量,作用域不会出该代码块
- static修饰局部变量,成为了代码块私有全局变量
- __pthread修饰局部变量,宏获得了线程安全性
- \符号表示忽略回车,表示仍是一行,未开新行