【问题标题】:assign variables before or in loops statement performance在循环语句性能之前或之中分配变量
【发布时间】:2017-12-09 15:53:15
【问题描述】:

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

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

虽然这样分配变量的代码会更清晰,但我想知道someFunction 函数中是否有计算过程,但在这样的循环之前分配变量会是一种更好的方法

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

或者不管编译器可以检测到这一点而不再计算它

【问题讨论】:

    标签: performance loops conditional-statements variable-assignment


    【解决方案1】:

    我用流行的语言 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;
        }
    }
    

    然后用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 中,我们得到了几乎非常接近的持续时间。

    结论

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

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 1970-01-01
      • 2010-09-29
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      相关资源
      最近更新 更多