使向量size脱离循环条件进行优化

问题描述

| fibs是std :: vector。建议使用g ++将fibs.size()移出循环,以节省每次计算的时间(因为向量可能会改变)
int sum = 0;
for(int i = 0; i < fibs.size(); ++i){
    if(fibs[i] % 2 == 0){
        sum += fibs[i];
    }
}
当然,在编译器中进行了一些数据流分析,可以告诉我们fib不会改变大小。在那儿?还是应该将其他变量设置为fibs.size()并在循环条件下使用它?     

解决方法

        编译器可能会确定它不会更改。即使这样做,向量的
size()
也是O(1)运算。     ,        除非您知道这是一个问题,否则请原谅。首先使其正确,然后使其清晰,然后使其快速(如有必要)。
vector::size
还是非常快。在我看来,编译器可能会优化这种情况,因为很明显,向量没有被修改,所有被调用的函数都将被内联,以便编译器知道。 您总是可以查看生成的代码,看看是否发生了这种情况。 如果确实要更改它,则需要能够测量它之前和之后所花费的时间。那是相当多的工作-您可能有更好的事情要做。     ,        size()是恒定时间操作,以这种方式调用不会有任何损失。如果您担心性能以及遍历集合的更通用方法,请使用迭代器:
int sum = 0;
for(auto it = fibs.cbegin(); it != fibs.cend(); ++it) {
    if((*it) % 2 == 0){
        sum += *it;
    }
}
    ,        我认为您在这里遗漏了另一个更重要的观点:该循环是否会导致应用程序运行缓慢?如果您不确定(例如,尚未进行概要分析),则可能会集中精力处理应用程序的错误部分。 在编写程序时(代码准则,应用程序的体系结构(更大的图片),变量名,函数名,类名,可读性等),您已经不得不将数千件事放在脑海中,您可以忽略代码的速度在最初的实施过程中(至少有95%的时间)。这将使您可以专注于更重要,更有价值的事情(例如正确性,可读性和可维护性)。     ,        在您的示例中,编译器可以轻松地分析流程并确定其没有变化。在更复杂的代码中,它不能:
for(int i = 0; i < fibs.size(); ++i){
    complicated_function();
}
complicated_function
可以更改
fibs
。但是,由于上述代码涉及函数调用,因此编译器无法将“ 7”存储在寄存器中,因此您无法消除对存储器的访问。