在循环语句性能之前或之中分配变量
assign variables before or in loops statement performance
在许多编程语言中,赋值在像这样的循环语句中是合法的。
while(variable1 = someFunction()){
...
}
虽然像这样分配变量的代码会更清晰我想知道 someFunction
函数是否有计算过程,但在像这样的循环之前分配变量会是更好的方法
variable1 = someFunction()
while(variable1){
...
}
或者无论如何,编译器可以检测到它不再计算它
我在 Java,JavaScript 和 [=68 中测试了这个=] 是流行的语言。
在每种语言中,首先我有一个从数字 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))
结果是 interesting.I 在每种语言中都得到了这个结果
Java :
循环前分配的持续时间:2
循环中分配的持续时间:326
Java脚本:
循环前分配的持续时间:4
循环中分配的持续时间:1846
但是在 python 我得到了
循环前分配的持续时间:66
循环中分配的持续时间:67
正如我们在 Java 和 Java 脚本中看到的那样,如果在循环期间结果相同,我们绝对不应该在循环中使用赋值变量,但在 python 中,我们几乎得到了持续时间非常接近。
结论
作为结论,我认为无论我们使用什么编程语言,但最好不要在循环中分配变量,如果它在循环期间结果保持不变
在许多编程语言中,赋值在像这样的循环语句中是合法的。
while(variable1 = someFunction()){
...
}
虽然像这样分配变量的代码会更清晰我想知道 someFunction
函数是否有计算过程,但在像这样的循环之前分配变量会是更好的方法
variable1 = someFunction()
while(variable1){
...
}
或者无论如何,编译器可以检测到它不再计算它
我在 Java,JavaScript 和 [=68 中测试了这个=] 是流行的语言。 在每种语言中,首先我有一个从数字 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))
结果是 interesting.I 在每种语言中都得到了这个结果
Java :
循环前分配的持续时间:2
循环中分配的持续时间:326
Java脚本:
循环前分配的持续时间:4
循环中分配的持续时间:1846
但是在 python 我得到了
循环前分配的持续时间:66
循环中分配的持续时间:67
正如我们在 Java 和 Java 脚本中看到的那样,如果在循环期间结果相同,我们绝对不应该在循环中使用赋值变量,但在 python 中,我们几乎得到了持续时间非常接近。
结论
作为结论,我认为无论我们使用什么编程语言,但最好不要在循环中分配变量,如果它在循环期间结果保持不变