bState为true时某个对象的数据成员。当bState
是错误的,这不是必需的,但也没有阻碍。
以下哪段代码会更高效,为什么?
(编辑:已更新,状态现在是该对象的成员)
const int x;
int i;
int iToBind;
Classname pObject[x];
for (; i < x; ++i) {
if (pObject[i].bState) {
pObject[i].somedatamember = iToBind;
}
}
与:
for (; i < x; ++i) {
pObject[i].somedatamember = iToBind;
}
最佳答案
我想说后者肯定更快。第一个版本具有双向内存访问权限,后者具有单向内存访问权限。
在此版本中:
for (; i < x; ++i) {
if (pObject[x].bState) {
pObject[x].somedatamember = iToBind;
}
}
if
语句期间出现停顿,因为CPU必须等待从内存中读取数据。读取内存的速度取决于数据所在的位置。离CPU越远,花费的时间越长:L1(最快),L2,L3,Ram,磁盘(最慢)。在此版本中:
for (; i < x; ++i) {
pObject[x].somedatamember = iToBind;
}
只有写入内存。写入内存不会使CPU停顿。
与内存访问时间一样,后一个循环在循环内部没有条件跳转。条件循环是相当大的开销,尤其是在采取/未采取决策实际上是随机的情况下。