【精品】C/C++内存优化的那些事

2015/10/01 - 优化 C/C++

避免没有必要的缺页中断

用new或者malloc申请内存时,系统并不会立刻分配相应内存,而是在实际使用时才这片内存时才分配。所以为了避免没有必要的缺页中断,可以在申请内存后,立刻初始化一遍内存,避免进程处理业务时产生终端。

使用mlock锁定内存,避免被交换出去。

尽量减少swap或把swap关掉。

https://bingoex.github.io/2016/08/02/linux-memory-2/ https://bingoex.github.io/2016/01/01/linux-memory-1/

减少页表映射

如果物理内存很大,映射表的条目将会非常多,会产生较多TLB Miss,内存访问过程很耗时。例如程序需要访问4MB的内存,那么就需要1024个页面,TLB需要1024个表项,同时需要1024个页表项,系统至少需要产生1024次TLB中断,才可以把4MB内存映射到物理内存。

通常情况下对于大块内存的频繁访问,可以采用大页表减少页表条目,提高内存查询速度

cat /proc/meminfo|grep "HugePages"可以查看大页表的状态

减少了内存页表项的缓存压力和CPU cache缓存内存地质映射的压力,提高了寻址能力和内存管理效率。大页内存还有其他一些使用时需要注意的地方:

  • 大页内存不能交换(SWAP).
  • 使用不当时可能造成更大的内存泄漏。

避免伪共享

多核CPU,每个核都拥有独立的L1/L2的缓存,而缓存按照最小单位缓存行进行和内存交互,缓存行一般为64字节。

当多线程修改互相独立的变量(一般出现在全局变量或者一些动态申请的内存)时,如果这些变量共享同一个缓存行,那么当某个核修改缓存行某个变量值时,需要锁定缓存行,同时其他核已经加载该缓存行的cache也跟着失效,需要重新从内存读取。

内存池,减少频繁申请、释放内存

https://bingoex.github.io/2015/09/05/linux-memory-3/


如果文章对您有帮助,欢迎扫描下方二维码赞助(一分也是爱噢),谢谢

Search

    一分也是爱噢 一分也是爱

    目录