Colderleo's blog Colderleo's blog
首页
Linux
C++
Python
前端
工具软件
mysql
索引
关于
GitHub (opens new window)

Colder Leo

热爱代码的打工人
首页
Linux
C++
Python
前端
工具软件
mysql
索引
关于
GitHub (opens new window)
  • bug定位的一些情形
  • c++性能调优,可能的情况
    • 通用设置
    • 特殊情况
    • 编译选项
  • total-编程知识点集锦
  • hpc_common.hpp
  • memory order 内存模型
  • 类型推导之auto-template-decltype
  • 完美转发forward源码分析
  • 左值和右值,右值引用、重载 std-move,引用折叠
  • cmake用法
  • alignas、alignof、sizeof实现内存对齐分配
  • 通过宏定义控制debug打印
  • 程序耗时性能测试
  • 线程池开源项目阅读
  • C++类中包含没有默认构造函数的成员
  • C++可变参数模板
  • C++属性继承 public protected private
  • C++智能指针
  • C++导出so的方法,以及extern C 注意事项
  • 四种spin lock
  • condition_variable和unique_lock
  • dpdk、kernel bypass
  • 智能网卡solarflare、Mellanox、X10等
  • 汇编寄存器和常见指令
  • c++ 类的静态成员变量未定义
  • C++获取类成员函数地址
  • preload示例
  • C++异常安全和RAII
  • C++11单例模式
  • C++歪门邪道
  • boost-program-option用法
  • c++17通过模板获取类成员的个数
  • 通过模板实现结构体成员拷贝-按成员名匹配
  • STL学习路径
  • boost库安装使用方法
  • C++文件读写
  • linux下socket通信demo,server和client
  • makefile写法
  • RxCpp
  • C++
gaoliu
2021-10-06
目录

c++性能调优,可能的情况

# 通用设置

隔核绑核、 不跨numa、 numa_balancing、 网络preload、 冷、 大页、 nohz、 增大tcp缓冲区

nohz、CONFIG_HZ、内核的时间片调度中断:

CONFIG_NO_HZ_FULL=y    # Kconfig
nohz=on
nohz_full=1,6-8
1
2
3
  • https://www.zhihu.com/question/21674968 (opens new window)
  • https://www.e-learn.cn/topic/3787602 (opens new window)
  • https://www.wenjiangs.com/doc/ucgeyuyt (opens new window)

# 特殊情况

有些库的rand随机数函数可能用了lock;

频繁大量申请和释放内存,shared_pointer;

blas库有好几种,openblas、blas等,有的是多线程版本的,有的是单线程的。用户代码是多线程的,一个核一个线程,此时再用多线程版本的blas库就会很慢,要用单线程的。

solarflare efvi poll的时候可尝试一次poll多个包

solarflare onload进行tcp收发包时,如果一个线程收包,另一个线程发包,并且收包线程如果循环非阻塞(NON_BLOCK)收取,则会对发包延迟产生影响,发包耗时增加约200-300ns

asio通过async_receive_from异步收udp包,或者async_read异步收tcp包时,会因为队列造成约300n延迟(智能网卡条件下)。用receive_from直接同步non_block收包,即可消除该延迟。

unsigned short port = 55555;
boost::asio::io_service iosrv;
boost::asio::ip::udp::socket udp_socket(iosrv);
boost::asio::ip::udp::endpoint ep;
boost::system::error_code errcode;
char recvbuf[1024];

udp_socket.non_blocking(true);
while(1) {
  int recvlen = udp_socket.receive_from(boost::asio::buffer(recvbuf, sizeof(recvbuf)), ep, 0, errcode);
  if(recvlen==0) continue;

  printf("received data, recvlen=%d\n", recvlen);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 编译选项

链接优化 -flto

gcc attribute 属性

__attribute__((always_inline))   

//参考 https://zhuanlan.zhihu.com/p/335327104
__attribute__((hot))   


__attribute__((always_inline)) int funA() {
  printf("aaa");
}
1
2
3
4
5
6
7
8
9
编辑 (opens new window)
上次更新: 2023/05/07, 17:27:54
bug定位的一些情形
total-编程知识点集锦

← bug定位的一些情形 total-编程知识点集锦→

最近更新
01
通过模板实现结构体成员拷贝-按成员名匹配
05-07
02
c++17通过模板获取类成员的个数
05-01
03
avx-sse切换惩罚
04-30
更多文章>
Theme by Vdoing | Copyright © 2019-2023 Colder Leo | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×