Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 在循环语句性能之前或循环中分配变量_Performance_Loops_Conditional Statements_Variable Assignment - Fatal编程技术网

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

Performance 在循环语句性能之前或循环中分配变量,performance,loops,conditional-statements,variable-assignment,Performance,Loops,Conditional Statements,Variable Assignment,在许多编程语言中,赋值在这样的循环语句中是合法的 while(variable1 = someFunction()){ ... } 虽然像这样分配变量的代码更清晰,但我想知道someFunction函数中是否有计算过程,在像这样的循环之前分配变量是更好的方法 variable1 = someFunction() while(variable1){ ... } 或者不管怎样,编译器都可以检测到这一点,不再计算它我在流行语言Java、JavaScript和Python中测试了这一点。 在每种语言

在许多编程语言中,赋值在这样的循环语句中是合法的

while(variable1 = someFunction()){
...
}
虽然像这样分配变量的代码更清晰,但我想知道
someFunction
函数中是否有计算过程,在像这样的循环之前分配变量是更好的方法

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

或者不管怎样,编译器都可以检测到这一点,不再计算它

我在流行语言JavaJavaScriptPython中测试了这一点。 在每种语言中,首先我有一个从数字1到1000求和的函数。 首先,我在循环之前分配这个值,并查看要完成的秒数,然后在循环条件中分配这个和,并再次查看结果

Java

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;
    }
}
结果很有趣。我在每种语言中都得到了这个结果

Java:

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

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

JavaScript:

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

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

但是在python中,我得到了

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

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

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

结论


作为一个结论,我认为不管我们使用什么编程语言,但是如果在循环过程中结果保持不变,最好不要在循环中分配变量

我在流行语言JavaJavaScriptPython中测试了这一点。 在每种语言中,首先我有一个从数字1到1000求和的函数。 首先,我在循环之前分配这个值,并查看要完成的秒数,然后在循环条件中分配这个和,并再次查看结果

Java

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;
    }
}
结果很有趣。我在每种语言中都得到了这个结果

Java:

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

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

JavaScript:

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

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

但是在python中,我得到了

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

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

正如我们在Java和JavaScript中所看到的,如果循环期间的结果相同,我们绝对不应该在循环中使用assign变量,但在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))