软件性能优化方法汇编

本文主要是对平时工作和Ulrich Drepper的《What Every Programmer Should Know About Memory》中软件性能优化方法的总结归纳,主要为了方便日后快速查看和检查,不涉及方法具体细节。本文涉及的软件性能优化手段包括cache、TLB、预取、多线程、总线带宽、NUMA等。日后会不定期更新。

cache优化

跳过cache

  • 对于一次性的读写操作(比如网卡收发包等),因为数据不会被重复使用,所以没有必要把数据更新到cache line中,避免换出cache中有用数据。相关方法:_mm_stream_si32/_mm_stream_load_si128等。

L1D cache优化

  • 改进数据局部性,如对于数组,1)把列访问改为行访问;2)把大矩阵切分成小矩阵,使数据集为一个cache line大小。
  • 如果CPU支持vectorization特性,使用SIMD (Single Instruction, Multiple Data)操作,提高指令效率。相关方法:_mm_load_sd/_mm_add_pd/_mm_mul_pd等。
  • 保证Critical Word First & Early Restart能最大发挥作用,最先使用的字段(Critical Word)放在数据结构的前面。
  • 按数据结构字段顺序访问字段。
  • 数据结构按cache line字长对齐。相关方法:__attribute((aligned(64)), posix_memalign等
  • 字段保证自然对齐,不要使用pack属性。
  • 大数据结构拆分成小数据结构。
  • 数组(集中)结构优于链表(分散)结构。

L1I cache优化

  • 使用分支预测,以便于编译器进行代码局部化优化。相关方法:__builtin_expect或-O2、-freorder-blocks编译器选项等。
  • 使用小循环代码块。
  • 保证代码对齐。相关方法:-falign_fuctions/-falign_jumps/-falign_loops=cache line字长等。

L2 cache优化

  • 数据集保证在L2 cache大小以内,以便减少L2 cache miss。
  • 对于超过L2 cache大小的大数据集,按L2 cache大小拆分成小数据集。

TLB优化

  • 减少使用页面数,减少TLB miss。相关方法:减小软件目标文件大小,减少数据集大小等。
  • 关闭内核 ASLR(Address Space Layout Randomization)特性,减少TLB miss。

预取优化

  • CPU自带的硬件预取。一般功能简单,如不支持跨页,不支持非线性访问,2+次cache miss后才会触发等。可酌情关闭,使用软件预取。
  • 软件预取。支持跨页和非线性访问。相关方法:__mm_prefetch、-fprefetch_loop_arrays等编译器选项等。
  • 使能CPU OOO(out of order)特性的推测预取。不需要软件干预。
  • 使用预取线程,要注意多线程同步问题。相关方法:超线程预取等。
  • 使能CPU DCA(Direct Cache Access)特性。不需要软件干预。

多线程优化

并发优化

  • 分离只读变量和读写变量,减少 false sharing,减少RFO(Request For Ownership)。相关方法:只读变量用const修饰等。
  • 使用线程本地变量,减少RFO。相关方法:__thread等。
  • 把变量分组集中,并按cache line对齐。相关方法:把只读变量、读写变量分别定义在不同的结构体中。

原子优化

  • LL/SC (Load Lock/Store Conditional)。相关方法:__sync_add_and_fetch等。
  • CAS (Compare-and-Swap)。相关方法:__sync_bool_compare_and_swap等。
  • Transaction Menory。

内存总线带宽优化

  • 设置线程亲和性(thread affinity)。保证工作在不同数据集的线程工作在不同的核上,从而保证L1 cache不共享。

NUMA优化

  • 设置内存亲和性策略。相关方法:set_mempolicy等。
  • 设置VMA地址空间亲和性策略。相关方法:mbind等。
  • 设置线程的CPU和内存亲和性策略:相关方法:cpuset等。

其他

通过gcc自动优化分支预测。相关方法:配置-fprofile_use、-fprofile_generate编译器选项。

把共享数据转化为独享数据。相关方法:对于只读数据,通过复制;对于读写数据,通过先在各node上累加,然后把累加结果再累加得到最终结果。

用度量工具(如massif、memuage等)发现连续分配小内存块的代码流程,重构为分配连续地址的大内存块。

用度量工具(pagein, time等)统计缺页情况。针对缺页严重模块改用大页面以便减少缺页次数。相关技术:hugetlb等。

--EOF--

时间: 2024-08-14 12:00:43

软件性能优化方法汇编的相关文章

垃圾邮件过滤优化方法

垃圾邮件过滤优化方法 通过honeypot project 搜集大量垃圾邮件数据 通过解析邮件header 获取垃圾邮件发送路径和服务器相关信息 对编写错误的单词的修正 比如:w4tch 对相同含义的词进行归类处理,比如:discount 和discounts   (可以通过porter stemmer,下面就是该算法c语言的一种实现) /* This is the Porter stemming algorithm, coded up in ANSI C by the author. It m

Linux网络性能优化方法简析

Linux网络性能优化方法简析 2010-12-20 10:56 赵军 IBMDW 字号:T | T 性能问题永远是永恒的主题之一,而Linux在网络性能方面的优势则显而易见,这篇文章是对于Linux内核中提升网络性能的一些优化方法的简析,以让我们去后台看看魔术师表演用的盒子,同时也看看内核极客们是怎样灵活的,渐进的去解决这些实际的问题. AD:2014WOT全球软件技术峰会北京站 课程视频发布 对于网络的行为,可以简单划分为 3 条路径:1) 发送路径,2) 转发路径,3) 接收路径,而网络性

Caffe学习系列(8):solver优化方法

上文提到,到目前为止,caffe总共提供了六种优化方法: Stochastic Gradient Descent (type: "SGD"), AdaDelta (type: "AdaDelta"), Adaptive Gradient (type: "AdaGrad"), Adam (type: "Adam"), Nesterov’s Accelerated Gradient (type: "Nesterov&qu

php-fpm优化方法 pm.min_spare_servers、pm.max_spare_servers 的真实意义

php-fpm 进程池优化方法 php-fpm进程池开启进程有两种方式,一种是static,直接开启指定数量的php-fpm进程,不再增加或者减少:另一种则是dynamic,开始时开启一定数量的php-fpm进程,当请求量变大时,动态的增加php-fpm进程数到上限,当空闲时自动释放空闲的进程数到一个下限.这两种不同的执行方式,可以根据服务器的实际需求来进行调整. 要用到的一些参数,分别是pm.pm.max_children.pm.start_servers.pm.min_spare_serve

30多条mysql数据库优化方法,千万级数据库记录查询轻松解决【转】

转自:http://www.ihref.com/read-16422.html 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描, Sql 代码 : select id from t where num is null; 可以在 num 上设置默认值 0,确保表中 num 列没有 null 值,然后这样查询: Sql 代码 : s

mark---[mysql多表关联查询的优化方法]

对于一个网站来说,数据库的结构至关重要.即要利于存储(入库不阻塞),又要利于查询(查询不锁表).网站数据库优化经验是一个积累的过程.下面就对多表关联查询的优化方法,举例说明. 现在社区分享类网站很火,就拿方维购物分享网站举例说明吧.也是对二次开发方维购物分享网站的一点总结,高手可以飞过. 购物分享的关键表有:分享表.图片表.文件表.评论表.标签表.分类表等. 围绕分享的表就么多,哇,那也不少啊.当我们查看一个图片的详细信息时,就要显示以上表里的信息.显示图片所属的分类.给图片打的标签.图片的评论

基于页面染色技术的内存数据库访问优化方法

本发明公开了一种基于页面染色技术的内存数据库访问优化方法.该方法首先将弱局部性数据集的所有数据页面的访问顺序按页面颜色进行排序,并将所有数据页面按页面颜色进行分组,然后按页面颜色分组的顺序扫描弱局部性数据集的所有数据页面.进一步地,预设若干具有相同页面颜色的内存页面作为页面颜色队列,该页面颜色队列用作内存页面被加载入CPU缓存之前的内存缓存:弱局部性数据集的数据页面首先通过异步方式进入页面颜色队列,然后再被加载到CPU缓存中完成数据处理.本发明能够解决内存数据库应用中无法依赖页面颜色为进程.线程

二级域名的优化方法

因为百度的一次大更新,一些之前完好的网站都被无情得k掉.只剩下一些二级域名,由于主站的庇佑还活着,不得已只能开始着手优化二级域名的站了. 大家都知道二级域名不同一级域名,就连换友链也是坑爹的,人家一看到二级域名就懒得来换了.而且各方面优化起来还是比较难的,那么,二级域名到底该如何优化呢? 优化二级域名最有效的一点就是提高主站权重. 对于搜索引擎来说你的二级域名是一个独立的站点,同时它也和我们的主域名网站有着很微妙的关系.我们可以打个比方,假如我们有一个主站,而如果我们在短期内在这个主域名下开通了

DevExpress ChartControl大数据加载时有哪些性能优化方法

DevExpress ChartControl加载大数据量数据时的性能优化方法有哪些? 关于图表优化,可从以下几个方面解决: 1.关闭不需要的可视化的元素(如LineMarkers, Labels等): Series.View.LineMarkerOptions.Visible =false. 2. 关闭图表的滚动与缩放功能,手动调整范围,这样将大大减少所需计算的个数. 3. 将 ChartControl.RefreshDataOnRepaint属性设为false 4. 将 ChartContr