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相关推荐

  1. Consumer设计-high/low Level Consumer

    1 Producer和Consumer的数据推送拉取方式   Producer Producer通过主动Push的方式将消息发布到Broker n Consumer Consumer通过Pull从Br ...

  2. Elasticsearch Java Low Level REST Client(通用配置)

    Elasticsearch Java Low Level REST Client(通用配置) 通用配置 正如初始化中所解释的,RestClientBuilder支持提供RequestConfigCal ...

  3. zabbix企业应用之low level discovery监控mysql

    之前介绍了使用zabbix监控固定3306端口的mysql(文章地址为http://dl528888.blog.51cto.com/2382721/1346590),有个不好的地方是只能监控固定的33 ...

  4. Kafka High Level API vs. Low Level API

    目录: 1.ConsumerApi 2.High Level Consumer (屏蔽细节管理) 3.Low Level API (细节需要自己处理) 1.Kafka提供了两种Consumer API ...

  5. Kafka:High level consumer vs. Low level consumer

    Kafka中的消费者有两套API,分别是high level的和low level的.两种消费方式在构造和实现上都是不同的,在此记录一下: 一.High level consumer API High ...

  6. Using HumanVisual System modeling for bio-inspired low level image processing

    摘要 在本文中,我们提出了一种图像处理方法,即所谓的"基于生物视觉的方法". 基本思想是通过对人类视觉系统(HVS)的某些部分进行建模来复制人类视觉系统(HVS),以开发低级图像处 ...

  7. ML-Agents与python的Low Level API通信

    本文基于我前面的文章Unity强化学习之ML-Agents的使用 参考Github链接:https://github.com/Unity-Technologies/ml-agents 参考文档:htt ...

  8. Elasticsearch java api操作(一)(Java Low Level Rest Client)

    一.说明: 一.Elasticsearch提供了两个JAVA REST Client版本: 1.java low level rest client: 低级别的rest客户端,通过http与集群交互, ...

  9. 如何使用 Elastic Search Low Level API 构造请求进行搜索

    场景: 需要在客户端构造请求调解, 调用 Elastic Search 的 API 取到结果,并且能够使用 ES 的授权机制. 方案: 一.在客户端构造 Low Level API . 二.Low L ...

最新文章

  1. WISMO模块GPRS上网设置的过程
  2. 独家 | 利用Omniverse Code应用开展虚拟宇宙的未来
  3. android用于打开各种文件的intent
  4. qt翻译---QTime
  5. pivot 附近有语法错误,您可能需要将当前数据库的兼容级别设置为更高的值。...
  6. 如何从零开始开发一个 Chrome 插件?
  7. 终于收到HacktoberFest的奖品啦
  8. Android build.gradle(app)介绍
  9. hill密码源代码c语言,古典密码(Hill加密算法)(示例代码)
  10. 【英语学习】【English L06】U06 Banking L4 I'd like to transfer some money
  11. Kali Linux 网络扫描秘籍 第八章 自动化 Kali 工具
  12. 循环执行次数 n(n+1)/2
  13. 危机十足站长的生命觉悟:拼命也得每天挤一滴墨水!
  14. mybatis 3.2.7 与 spring mvc 3.x、logback整合
  15. 微信小程序实现网络请求API获取数据
  16. java技术总监一般问什么_技术总监面试题(Java),看看你会多少?
  17. C#上位机与台达PLC通信,modbus TCP协议
  18. 关注流浪猫:从我们出发
  19. 《计算机操作系统》重点知识笔记整理(一)
  20. 前端页面复制粘贴插件Clipboard的使用

热门文章

  1. js打印到控制台_前端JS,8个问题测试你真的懂吗(高频面试题,附答案)
  2. 机器学习理论与实战:逻辑回归
  3. 感知器(Perceptron)
  4. 关联规则算法Apriori的学习与实现
  5. 台达编码器型号含义_编码器型号说明 编码器型号大全 编码器型号选型
  6. tiptop 编译运行_ERP(tiptop linux下主要命令)
  7. 苹果5s现在还能用吗_苹果ios稳定企业签名,现在苹果企业签名还是最稳定的苹果签名吗...
  8. android中的SharedPreferences存储
  9. windows无法格式化u盘_windows无法完成格式化怎么办
  10. java 降低jdk版本_jdk1.7降级到1.6 | 学步园