首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在循环语句性能之前或在循环中分配变量

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

Stack Overflow用户
提问于 2017-07-05 20:24:33
回答 1查看 100关注 0票数 1

在许多编程语言中,赋值是合法的循环语句,如下所示。

代码语言:javascript
复制
while(variable1 = someFunction()){
...
}

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

代码语言:javascript
复制
variable1 = someFunction()
while(variable1){
...
}

或者,无论怎样,编译器都可以检测到这一点,从而不再计算它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-06 07:22:07

我在流行语言、JavaScript和Python中测试了这一点。在每一种语言中,我都有一个从1到1000的函数。首先,我在循环之前分配这个值,然后查看要完成的第二次接收,然后在循环条件下分配这个和,然后再次看到结果。

Java

代码语言:javascript
复制
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编写以下代码:

代码语言: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编写了这个代码。

代码语言:javascript
复制
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中,我们得到的持续时间几乎非常接近。

结论

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44935370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档