无意看到一篇小短文,猜测作者应该是一个图形学领域的程序员或专家,介绍了在光线(射线)追踪程序中是如何优化C/C++代码的。倒也有一些参考意义,当然有的地方我并不赞同或者说我也不完全理解,原文在此,我的粗糙翻译如下:

1. 牢记Ahmdal定律
funccost表示是函数func的运行时间百分比,funcspeedup是你优化后函数的运行系数;
所以,如果函数TriangleIntersect()占用40%的运行时间,而在你优化后使它运行快了两倍,那么你的程序运行能够快了25%;
这意味着不经常使用的代码不需要做过多优化(或者完全不优化),比如场景加载过程;
也就是:让频繁调用的代码运行得更加高效,而让较少调用的代码保持运行正确;
2. 先有正确的代码,然后再做优化
这并不是说先花8个周时间写一个全功能的光线追踪器,然后再花8个周去优化;
而是在你的管线追踪程序中的多个阶段都进行优化;
如果代码是正确的,而你又知道哪些函数会被频繁的调用,优化是很明显的;
然后找到瓶颈所在,并去除瓶颈(通过优化或者算法改进)。通常来说改进算法可以很显著地优化瓶颈——甚至可能采用了一个你没想到的算法。优化那些你所知道的将被频繁调用的函数是一个很好的做法;
3. 那些我认识的能够写出非常高效的代码的人说,他们花费在优化代码上的时间是他们写代码时间的至少两倍以上
4. 跳转/分支语句是昂贵的,不管何时尽可能的减少使用
函数调用除了栈存储操作外,还需要两次跳转;
优先选择迭代,而不是递归;
如果是短函数,使用内联来消除函数开销;
将循环放在函数内(例如将for(i=0;i<100;i++) DoSomething();改为在DoSomething()内做DoSomething());
长长的if...else if...else if...else if...语句链需要大量的跳转才能结束(除了在测试每个条件时)。如果可能,改为switch语句,有时编译器可以有优化为在一个表中查找和单级跳转。如果switch语句是不可能的,那把最经常走到的if语句放在语句链开头;
5. 考虑数组索引的顺序
两维或更多维的数组在内存中仍是按一维存储的。这意思是array[i][j]和 array[i][j+1]是相邻的(C/C++代码),然而array[i][j]和array[i+1][j]却可以相离的任意远;
访问物理内存中的连续数据,可以显著加快你的代码(有时是一个数量级,甚至更多);
现在CPU从主内存中加载数据到高速缓存时,它不仅仅是只加载单一数据,而是加载一块数据,既包含了要请求的数据,也包含部分相邻数据(一个cache行)。这意思是说如果array[i][j]在CPU缓存中,那么array[i][j+1]就很有可能也在缓存中了,然而array[i+1][j]可能仍在内存中;
6. 考虑指令级并行性(IPL)
尽管很多程序仍是单线程执行,但现代的CPU已经能够在单核上有显著的并行性。这意味着单CPU也可能同时执行4个浮点数乘法、等待4个内存请求,并执行即将到来的分支比较操作
为了充分利用这种并行性,代码块(比如在跳转语句中)需要足够的独立指令来使CPU得到充分使用;
可以考虑通过展开循环来改进;
这也是使用内联函数的一个很好的原因;
7. 避免或减少局部变量的使用
局部变量通常是存储在栈上。如果很少,可以存储在寄存器中。在这种情况下,函数不仅得到了对存储在寄存器上的数据的更快内存访问的好处,也可以避免建立一个栈帧的开销;
但是,也不要把所有对象都全盘声明为全局变量;
8. 减少函数参数的个数
和减少局部变量的原因一样——他们也是在栈上存储的;
9. 结构体(包括类)传参时使用传引用而不是传值
在光线追踪程序中,哪怕是简单如vector、points、colors等结构,我也没有见过使用值传递的代码
10. 如果你不需要一个函数的返回值,那就不要返回
11. 尽可能避免使用转型操作
整数和浮点数的指令集通常在不同的寄存器上运算,因此转型操作需要拷贝操作;
短整形(char和short)仍然需要一个全尺寸的寄存器,而且在存储回内存之前,它们需要对齐到32位或64位上,然后才转换成更小尺寸类型;
12. 当定义C++对象时一定要小心
使用初始化(Color c(black))而不是赋值(Color c, c = black),而前者更快;
13. 使类的默认构造函数尽可能的轻量
特别是那简单的、经常使用的类(例如,颜色,矢量,点等);
这些默认构造函数通常是在你不注意时就调用,甚至那时你并不希望这样;
使用构造初始化列表(使用Color::Color() : r(0), g(0), b(0) {}而不是Color::Color() { r = g = b = 0; } );
14. 尽可能使用移位操作符>>和<<,而不是整数乘法和除法
15. 小心使用查表功能
很多人鼓励对于复杂的功能(例如,三角函数)使用预先计算过值的查表法。对于光线跟踪程序来说,这往往是不必要的。内存查找是非常(日益)昂贵的,而且重新计算三角函数往往和从内存中查找值一样快(尤其是当你考虑到内存查找会影响CPU缓存命中率时);
在其它情况下,查表可能是非常有用的。比如在GPU编程中,查表法通常是复杂功能的优先选择;
文章出处:http://www.51testing.com/html/19/n-866519.html

优化C/C++代码的小技巧相关推荐

  1. 网站内部优化的4个细节小技巧

    内部优化就是对网站内容和链接的优化工作,做好内部优化对网站的排名和权重提升有着重要的作用.但对于网站内部优化,很多优化人员也没有明确的优化方向和方案,导致网站内部优化很麻烦.很复杂,那是他们还没有找到 ...

  2. VS开发中的代码编写小技巧——避免重复代码编写的几种方法

    原文:VS开发中的代码编写小技巧--避免重复代码编写的几种方法 上一篇文章中程序员的幸福生活--有你的日子,每天都是情人节,收到了大家的很多好评.鼓励和祝福,非常感动,真诚的谢谢大家.也希望每个朋友都 ...

  3. cnc数控机床怎么使用计算机,五个数控机床CNC加工中心的编程代码加工小技巧!...

    五个数控机床CNC加工中心的编程代码加工小技巧! CNC加工中心的加工过程中,有一点至关重要,那就是在编制程序和操作加工时,一定要避免使CNC加工中心发生碰撞.因为CNC加工中心的价格非常昂贵,少则几 ...

  4. Vue 工程代码阅读小技巧

    Vue 工程代码阅读小技巧 对于一个刚刚接触 vue 的 小白白,怎样才能高效的阅读别人的 vue 工程代码.当然,有的项目有工程介绍,这令当别论,你就老老实实地看文档吧,看完差不多也了解业务流程了, ...

  5. 网页代码常用小技巧!(2)

    网页代码常用小技巧!(2) [转] 41.变换网页的鼠标光标 〈BODY style=CURSOR: url(http://203.73.125.205/~liangmi2/farmfrog01.cu ...

  6. xp下优化OpenGL模式运行速度的小技巧

    转发一个xp下优化OpenGL模式运行速度的小技巧,修改工具已经传上了 从一个linux论坛看来,原本用于让linux跑war3流畅些,一直没有在windows中使用过.晚上在XP里试验了一下成功了, ...

  7. 谷歌关键词优化:谷歌推广的小技巧-大舍传媒

    谷歌关键词优化:谷歌推广的小技巧-大舍传媒 关键词优化:谷歌推广的小技巧 谷歌搜索推广是时下出口型企业选择比较多的推广方式,那麼,要想得到好一点的推广预期效果,一定要掌握一定的推广方式.易外贸为大家分 ...

  8. 嘘,Python 优化提速的 8 个小技巧

    Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足.但是,有很多时候,Python 的效率并没有想象中的那么夸张.本文对一些 Python 代码加速运行的技巧 ...

  9. 优化Pytorch模型训练的小技巧

    在本文中,我将描述并展示4种不同的Pytorch训练技巧的代码,这些技巧是我个人发现的,用于改进我的深度学习模型的训练. 混合精度 在一个常规的训练循环中,PyTorch以32位精度存储所有浮点数变量 ...

最新文章

  1. macOS Sierra 10.12虚拟机安装
  2. python类是实例的工厂_Python设计模式之工厂方法模式实例详解
  3. 从U盘自动安装centos5.3到服务器
  4. 解决 WPF 绑定集合后数据变动界面却不更新的问题
  5. eclipse打包项目为aar_新生日常牢骚之作业打包
  6. mac 卸载 mysql su_UBUNTU 彻底删除 MYSQL 然后重装 MYSQL
  7. 两表查询很慢mysql_影响mysql性能的方面
  8. android游戏分成,原神半年吸金10亿美元,为何国内Android商店还秉承着55分成?
  9. 数独超难题目_超难数独基本解题法
  10. iOS从零开始学习socket编程——高并发多线程服务器
  11. vs2008中文版提供下载(包含中文msdn),包括vs2008序列号和破解方法。
  12. java源码分析-注解AnnotatedElement接口
  13. 为您揭秘当今直播源码为何如此火爆
  14. 科学计算机的圆周率,科学家用超级计算机计算圆周率,到底有什么意义?真能算出来吗?...
  15. EclipseCDT
  16. [ArrayList删除元素] 你需要了解的ArrayList如何安全的删除重复元素/ list去重
  17. dw常用标签_dreamweaver中常用到的标签及含义
  18. mysql备份与还原心得体会_MySQL数据恢复心得体会
  19. 51单片机10S秒表功能
  20. 《奇葩说》詹青云:熬过那些日子,你才有资格过不被人左右的人生

热门文章

  1. JavaScript基础语法快速入门
  2. php任意地方关闭弹窗,vue和jq中实现点击任意地方关闭弹窗
  3. linux原有的文件系统扩展,Linux VG扩展新增硬盘并新建文件系统
  4. mysql优于oracle的地方_MYSQL转为ORACLE要注意的地方
  5. 原生vue.js实现待办事项清单,支持增删改查
  6. CentOS 7笔记yum install epel-release
  7. PyQt5将ui文件编译为py文件的方法
  8. 解决打包AssetBundle时Shader(材质)丢失问题
  9. 集群式游戏服务器架构方案设计开发
  10. MFC 教程【14_SOCKET类的设计和实现】