C++优化tips

来源:互联网 发布:抢购软件有用吗 编辑:程序博客网 时间:2024/05/21 08:47

1 __builtin_expect参数
这个参数可以预测分支,从而优化程序性能。
编译器版本 GNUC < 4的时候

_builtin_expect((expr),1) //表示这个expr有很大可能发生_builtin_expect((expr),0) //表示这个expr有很大可能不发生

2. attribute((regparm(n)))
传递参数的时候希望通过寄存器传递参数,n的范围为0~3。
编译器版本 GNUC >= 3

#define REGPARM1 __attribute((regparm(1)))void REGPARM1 foo(int i)//参数i通过寄存器传递

3. gcc 编译时可以指定宏
gcc -DCONFIG_REGPARM=3 相当于相面的指令

    #define CONFIG_REGPARM 3

4. 内存映射,可以加速文件与内存的交互

/*addr明确指定内存映射文件的起始地址length 指定内存映射的大小prot代表权限 PROT_READ/ PROT_WRITE/ PROT_EXECflag 代表映射方式,有两种MAP_PRIVATE / MAP_SHARED MAP_SHARED表示每个进程之间保留自己的备份fd代表想要映射的文件的descripter最后一个参数代表文件的便宜,和第二个参数搭配使用可以分阶段映射大文件。*/void *mmap( void *addr, size_t length, int prot, int flag, int fd, off_t offset );

5 CPU亲和

cpu_set_t set; CPU_ZERO(&set); //cpu_set_t 清零CPU_SET(run_cupmask,&set);  //将CPU加到set中sched_setaffinity(0,sizeof(cpu_set_t),&set);//设置当前进程/线程亲和set中CPU

6 查看c++所有预定义宏
cpp -dM /dev/null

7 Linux c++ 设置keepalive包的参数
TCP连接在空间时间会发送keepalive来维持TCP的连接
设置TCP连接的代码如下

static int keep_alive = 1;   // 开启keepalive属性. 缺省值: 0(关闭)  static int keep_idle = 5;   // 如果在60秒内没有任何数据交互,则进行探测. 缺省值:7200(s)  static int keep_interval = 5;   // 探测时发探测包的时间间隔为5秒. 缺省值:75(s)  static int keep_count = 3;   // 探测重试的次数. 全部超时则认定连接失效..缺省值:9(次)  status = setsockopt(conn->fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&keep_alive, sizeof(keep_alive));    status = setsockopt(conn->fd, SOL_TCP, TCP_KEEPIDLE, (void*)&keep_idle, sizeof(keep_idle));    status = setsockopt(conn->fd, SOL_TCP, TCP_KEEPINTVL, (void*)&keep_interval, sizeof(keep_interval));    status = setsockopt(conn->fd, SOL_TCP, TCP_KEEPCNT, (void*)&keep_count, sizeof(keep_count));

如果keepalive 返回失败,conn->fd 对应的epoll_wait 会返回EPOLLERR的错误事件

0 0