关于代码性能,我很好奇这种情况,因为它一次又一次地出现.
int val; //can be 0 or 1
if (val)
global_var += val
Run Code Online (Sandbox Code Playgroud)
要么:
int val; //can be 0 or 1
global_var += val
Run Code Online (Sandbox Code Playgroud)
基本上,在性能,分支错误预测或不必要地增加0的情况下,哪些更昂贵?这里有一般规则,还是个案有关?
关于C代码的性能(或几乎任何其他语言的代码,就此而言)都无法有意义地说出来.或许可以有意义地谈论使用一个特定版本的一个编译器编译的代码的性能,在针对特定体系结构的特定优化级别上执行并在该体系结构的特定实现上执行,但即使这样,您也会留下许多事情(I例如,当可执行文件的名称发生变化时,某人经过仔细手动调整的代码会遭受50%的性能回归.
除此之外,在大多数现代架构中,比较,条件分支和添加指令都是单周期操作(并且在分支上经常存在执行端口限制).在这样的体系结构中(除非你的目标是非常奇特的东西,否则你可能会遇到的所有体系结构),单个添加总是至少与条件添加一样快,从而限制了非常不寻常的性能假象.
分支错误预测成本根本不会进入.当你做一个条件分支(甚至忽略错误预测成本)时,你可以简单地完成添加.
在这个快速而肮脏的分析中有一些极端情况:例如,如果global_var许多工作线程以相同的方式使用它,并且几乎所有工作线程val都为零,那么可以构建一个实际使用条件增量的示例更快,因为它减轻了global_var驻留的高速缓存行的大部分争用.或者,global_var实际上可能是一个内存映射的方法来访问一些具有极慢读取或写入的外来硬件; 再次,如果val通常为零,有条件地进行增量可能是一个胜利.然而,所有这些例外都是相当专业的案例,大多数程序员都不会遇到(而那些遇到过他们的人希望能够充分了解他们自己在做这项分析时所做的工作).还要注意,在所有这些极端情况下,分支预测的成本都不是问题; 相反,它的访问成本global_var增加了问题的兴趣.
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |