C++ Low level performance optimize 2
C++ Low level performance optimize 2
上一篇 文章讨论了一些底层代码的优化技巧,本文继续讨论一些相关的内容。
首先,上一篇文章讨论cache missing的重要性时,用了list做比较,目的并不是说list没有用,而是说明cache missing会对性能有重要影响。如果元素不多,并且对象复制的代价很大,那么list可能就是更好的选择。其次,这里讨论的大部分是编码时一些比较底层的技巧,当遇到性能问题时,应该先考虑是否能在高层改进算法,减少运算,实在不行,在考虑这类优化技巧。性能优化的挑战就在于没有完美的永远适用的方案,了解这些技巧让我们在优化代码时有更多武器,但最终选择哪个方案还需要更加实际情况,并且以profile的实际数据为依据来做。
1. Data Layout
调整数据布局是常见的优化手段,做此类优化时有几点需要注意:首先是内存占用,现代编译器默认大多以16或32位对齐,因此
struct BadLayout {int8_t i0;int32_t i1;int8_t i2; };struct GoodLayout {int8_t i0;int8_t i2;int32_t i1; };
sizeof(Goodlayout) >= sizeof(BadLayout) 在vs2013默认对齐设置下,BadLayout==12 byte,GoodLayout==8byte。
其次,经常访问或者相关的数据应该放到一起,减少cache missing。Going native2013 Andrei Alexandrescu介绍了facebook做的重要性能优化就是把php代码编译为c++代码,而在代码转换中重要的一步就是根据数据的”hotness”重新布局。
struct BadLayout {auto user0_data0;auto user1_data1;auto user0_data1;auto user1_data0; };struct GoodLayout {auto user0_data0;auto user0_data1;auto user1_data0;auto user1_data1;};
最后,可维护性!这一点非常重要,对于一些生命周期较长的项目来说,把数据按逻辑组织更易于维护,减少潜在bug的重要性,如果性能差别不大,我通常更愿意让代码看起来好读J
2. Code cache
struct BitBool {bool b0 :1;bool b1 :1;bool b2 :1; }struct NormalBool {bool b0;bool b1;bool b2; }
上次的例子中,这段代码比较有争议,让我们从时间和空间方面来分析。时间上,因为BitBool需要额外指令来访问元素,因此效率一定比NormalBool低,但差别非常小,几乎可以忽略。再看空间上,但从结构本身看,显然BitBool更小,但是由于访问元素需要额外指令,实际应用中,生成的代码一定比NormalBool多,读取访问的次数越多,生成的代码也越多(内联的结果),而代码也需要占用内存空间!!cache line中通常一半是代码,一半是数据。因此,不一定因为BitBool本身小就得到更好的cache。大部分文章在讨论cache missing时都只介绍了数据,而忽略了代码也需要占用内存,也会有cache missing。某些游戏引擎会在update entity时先把对象按照类型排序,就是为了减少代码的cache missing。
最后,这个例子的目的是让大家了解过度优化可能并不会带来性能提升,实际应用中两种写法的虽然有性能差距,但基本可以忽略。
3. more about bit field
上一个例子让我想起了bitfield另一个微妙的地方,假设f1和f2在两个不同线程中,考虑下面代码是安全的吗?
struct BitField {bool b0 : 1;bool b1 : 1;bool b2 : 1;uint8_t i0 :3; }BitField bf; std::mutex mtx1;std::mutex mtx2; //thread 1 void f1() {mtx1.lock();bf.b1 = somevalue;mtx1.unlock(); } //thread 2 void f2() {mtx2.lock();bf.i0 = somevalue;mtx2.unlock(); }
No!!!虽然代码可以通过编译运行,但却并不是线程安全的,因为b1,i0都属于同一快内存”单元”,因此根本无法生成只更新b1,但是不写入i0的代码!!实际上c++11明确指出了这种情况会导致race,临近的bit总是被当做一个”对象” :)
转载于:https://www.cnblogs.com/clayman/p/3659312.html
C++ Low level performance optimize 2相关推荐
- Consumer设计-high/low Level Consumer
1 Producer和Consumer的数据推送拉取方式 Producer Producer通过主动Push的方式将消息发布到Broker n Consumer Consumer通过Pull从Br ...
- Elasticsearch Java Low Level REST Client(通用配置)
Elasticsearch Java Low Level REST Client(通用配置) 通用配置 正如初始化中所解释的,RestClientBuilder支持提供RequestConfigCal ...
- zabbix企业应用之low level discovery监控mysql
之前介绍了使用zabbix监控固定3306端口的mysql(文章地址为http://dl528888.blog.51cto.com/2382721/1346590),有个不好的地方是只能监控固定的33 ...
- Kafka High Level API vs. Low Level API
目录: 1.ConsumerApi 2.High Level Consumer (屏蔽细节管理) 3.Low Level API (细节需要自己处理) 1.Kafka提供了两种Consumer API ...
- Kafka:High level consumer vs. Low level consumer
Kafka中的消费者有两套API,分别是high level的和low level的.两种消费方式在构造和实现上都是不同的,在此记录一下: 一.High level consumer API High ...
- Using HumanVisual System modeling for bio-inspired low level image processing
摘要 在本文中,我们提出了一种图像处理方法,即所谓的"基于生物视觉的方法". 基本思想是通过对人类视觉系统(HVS)的某些部分进行建模来复制人类视觉系统(HVS),以开发低级图像处 ...
- ML-Agents与python的Low Level API通信
本文基于我前面的文章Unity强化学习之ML-Agents的使用 参考Github链接:https://github.com/Unity-Technologies/ml-agents 参考文档:htt ...
- Elasticsearch java api操作(一)(Java Low Level Rest Client)
一.说明: 一.Elasticsearch提供了两个JAVA REST Client版本: 1.java low level rest client: 低级别的rest客户端,通过http与集群交互, ...
- 如何使用 Elastic Search Low Level API 构造请求进行搜索
场景: 需要在客户端构造请求调解, 调用 Elastic Search 的 API 取到结果,并且能够使用 ES 的授权机制. 方案: 一.在客户端构造 Low Level API . 二.Low L ...
最新文章
- WISMO模块GPRS上网设置的过程
- 独家 | 利用Omniverse Code应用开展虚拟宇宙的未来
- android用于打开各种文件的intent
- qt翻译---QTime
- pivot 附近有语法错误,您可能需要将当前数据库的兼容级别设置为更高的值。...
- 如何从零开始开发一个 Chrome 插件?
- 终于收到HacktoberFest的奖品啦
- Android build.gradle(app)介绍
- hill密码源代码c语言,古典密码(Hill加密算法)(示例代码)
- 【英语学习】【English L06】U06 Banking L4 I'd like to transfer some money
- Kali Linux 网络扫描秘籍 第八章 自动化 Kali 工具
- 循环执行次数 n(n+1)/2
- 危机十足站长的生命觉悟:拼命也得每天挤一滴墨水!
- mybatis 3.2.7 与 spring mvc 3.x、logback整合
- 微信小程序实现网络请求API获取数据
- java技术总监一般问什么_技术总监面试题(Java),看看你会多少?
- C#上位机与台达PLC通信,modbus TCP协议
- 关注流浪猫:从我们出发
- 《计算机操作系统》重点知识笔记整理(一)
- 前端页面复制粘贴插件Clipboard的使用
热门文章
- js打印到控制台_前端JS,8个问题测试你真的懂吗(高频面试题,附答案)
- 机器学习理论与实战:逻辑回归
- 感知器(Perceptron)
- 关联规则算法Apriori的学习与实现
- 台达编码器型号含义_编码器型号说明 编码器型号大全 编码器型号选型
- tiptop 编译运行_ERP(tiptop linux下主要命令)
- 苹果5s现在还能用吗_苹果ios稳定企业签名,现在苹果企业签名还是最稳定的苹果签名吗...
- android中的SharedPreferences存储
- windows无法格式化u盘_windows无法完成格式化怎么办
- java 降低jdk版本_jdk1.7降级到1.6 | 学步园