在循环语句性能之前或之中分配变量

时间:2017-07-05 20:24:34

标签: performance loops conditional-statements variable-assignment

在许多编程语言中,分配在循环语句中是合法的。

while(variable1 = someFunction()){
...
}

虽然更好的代码分配这样的变量,我想知道someFunction函数是否有一个计算过程,这将是一个更好的方式在这样的循环之前分配变量< / p>

variable1 = someFunction()
while(variable1){
...
}

或者无论如何,编译器都可以检测到这一点而不再计算它

1 个答案:

答案 0 :(得分:0)

我在流行语言的 Java JavaScript Python 中进行了测试。 在每种语言中我首先有一个从1到1000的函数。 首先我在循环之前分配这个值并查看完成的第二次卷取,然后我在循环条件中分配这个总和并再次看到结果

<强>爪哇

public class Main {
    public static void main(String args[]){

        //assign variable before loop
        long startTime= System.currentTimeMillis();
        int counter = sum();
        for (int i = 0; i < counter; i++) {
            //some code
        }
        long finishTime = System.currentTimeMillis();
        System.out.println("duration for assign before loop : "+(finishTime-startTime));

        //assign variable in  loop
        startTime = System.currentTimeMillis();
        for (int i = 0; i < sum(); i++) {
            //some code
        }
        finishTime = System.currentTimeMillis();
        System.out.println("duration for assign in loop : "+(finishTime-startTime));

    }
    public static int sum(){
        int sum = 0;
        for (int i = 1; i < 1000; i++) {
            sum+=i;
        }
        return sum;
    }
}

然后在javascript中编写此代码:

function sum(){
        let sum = 0;
        for (let i = 1; i < 1000; i++) {
            sum+=i;
        }
        return sum;
}
(function(){
        //assign variable before loop         
        let startTime= Date.now();
        let counter = sum();
        for (let i = 0; i < counter; i++) {
            //some code
        }
        let finishTime = Date.now();
        console.log("duration for assign before loop : "+(finishTime-startTime))

        //assign variable in  loop
        startTime = Date.now();
        for (let i = 0; i < sum(); i++) {
            //some code
        }
        finishTime = Date.now()
        console.log("duration for assign in loop : "+(finishTime-startTime));
})()

最后,我在python中编写了这段代码

import time

def current_milli_time():
    return int(round(time.time() * 1000))

def sum():
    sum = 0
    for i in xrange(1,1000):
        sum += i
    return sum

if __name__=="__main__":
    #assign before loop
    startTime = current_milli_time()
    counter = sum()
    for i in xrange(1,counter):
        pass
    finishTime = current_milli_time()
    print("duration for assign before loop : "+str(finishTime-startTime))

    #assign in loop
    startTime = current_milli_time()
    for i in xrange(1,sum()):
        pass
    finishTime = current_milli_time()
    print("duration for assign in loop : "+str(finishTime-startTime))

结果很有趣。我在每种语言中得到了这个结果

Java:

循环前分配的持续时间:2

循环分配的持续时间:326

JavaScript:

循环前分配的持续时间:4

循环分配的持续时间:1846

但是在 python 我得到了

循环前分配的持续时间:66

循环中分配的持续时间:67

正如我们在Java和JavaScript中看到的那样,我们绝对不应该在循环中使用赋值变量,如果它在循环期间结果相同但在python中,我们的持续时间几乎非常接近。

<强>结论

作为结论,我认为无论我们使用何种编程语言,如果在循环期间结果保持不变,最好不要在循环中分配变量