if语句的效率
来源:互联网 发布:hadoop书籍推荐 知乎 编辑:程序博客网 时间:2024/06/02 07:22
这个帖子的内容非常精彩。
http://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array
大概内容是在这样的,有这么一条语句:
if (data[c] >= 128) sum += data[c];data数组是排过序的(不管逆序还是顺序),那么执行效率非常高。
如果data数组是乱序的,那么执行效率极低。
造成这一现象的原因编译器是“分支预取”技术。
如果前一次 data[i]>128,那么下一次认为data[i+1]>128的可能性非常大,所以对于流水线技术的cpu来说,会预取分支内的代码。
所以说,对于排过序的数组来说,或许只有 “ data[6]<128 data[7]=128 data[8]>128”,当 i = 8时,cpu丢掉了预取得东西。
对于乱序的数组来说,那cpu丢弃预取的数据的概率是50%。
效率当然不同。
这段话对应的原文内容如下:
T = branch takenN = branch not takendata[] = 0, 1, 2, 3, 4, ... 126, 127, 128, 129, 130, ... 250, 251, 252, ...branch = N N N N N ... N N T T T ... T T T ... = NNNNNNNNNNNN ... NNNNNNNTTTTTTTTT ... TTTTTTTTTT (easy to predict)
data[] = 226, 185, 125, 158, 198, 144, 217, 79, 202, 118, 14, 150, 177, 182, 133, ...branch = T, T, N, T, T, T, T, N, T, N, N, T, T, T, N ... = TTNTTTTNTNNTTTN ... (completely random - hard to predict)
解决方法:
if (data[c] >= 128) sum += data[c];
变成:
int t = (data[c] - 128) >> 31;sum += ~t & data[c];
当然,前提是降低了可读性。
0 0
- if语句的效率
- if 和switch语句效率比较
- if 和 else if 的效率问题
- switch与if的效率
- [初学笔记] matlab中 switch和if 语句的区别和效率问题
- ASP的IF语句
- if 语句的优化
- tc的if语句
- if语句的用法
- Python的if语句
- 有趣的if语句
- if语句的应用
- IF语句的嵌套
- shell的if语句
- dos的 if语句
- IF语句的介绍
- if语句的判断
- if语句的举例
- 我的2013年
- MAPJOIN来解决实际的问题
- 【设计模式-观察者模式】
- Android系统中setprop,getprop,watchprops命令的使用
- Chapter 6 The keyboard
- if语句的效率
- 【设计模式-代理模式】
- 写给即将进入IT行业的应届生们——谈谈IT岗位(只转载软件工程师的部分&美化了一下)
- 九度OJ 1078 二叉树遍历
- 动手学MFC之二——对话框初探
- duilib 关于怎么调用ListUI中的GetItemText
- HDU:2795 Billboard
- ubuntu12.04英文版安装中文输入法
- Understanding a Kernel Oops