for循环优化

1 篇文章 0 订阅

今天就来说一下Java代码优化的事情,今天主要聊一下对于for(while等同理)循环的优化。

 

作为三大结构之一的循环,在我们编写代码的时候会经常用到。循环结构让我们操作数组、集合和其他一些有规律的事物变得更加的方便,但是如果我们在实际开发当中运用不合理,可能会给程序的性能带来很大的影响。所以我们还是需要掌握一些技巧来优化我们的代码的。

 

嵌套循环

stratTime = System.nanoTime();  
for (int i = 0; i < 10000000; i++) {  
    for (int j = 0; j < 10; j++) {  
          
    }  
}  
endTime = System.nanoTime();  
System.out.println("外大内小耗时:"+ (endTime - stratTime));         

应改为:

stratTime = System.nanoTime();  
for (int i = 0; i <10 ; i++) {  
    for (int j = 0; j < 10000000; j++) {  
          
    }  
}  
endTime = System.nanoTime();  
System.out.println("外小内大耗时:"+(endTime - stratTime));  


两者耗时对比:

外大内小耗时:200192114  
外小内大耗时:97995997  

由以上对比可知,优化后性能提升了一倍,嵌套循环应该遵循“外小内大”的原则,这就好比你复制很多个小文件和复制几个大文件的区别。

提取与循环无关的表达式

stratTime = System.nanoTime();  
for (int i = 0; i < 10000000; i++) {  
    i=i*a*b;  
}  
endTime = System.nanoTime();  
System.out.println("未提取耗时:"+(endTime - stratTime));  


应改为:
 

stratTime = System.nanoTime();  
c = a*b;  
for (int i = 0; i < 10000000; i++) {  
    i=i*c;  
}  
endTime = System.nanoTime();  
System.out.println("已提取耗时:"+(endTime - stratTime));  

两者耗时对比:

未提取耗时:45973050  
已提取耗时:1955  

代码中a+b与我们的循环无关,所以应该把它放到外面,避免重复计算,可以看出,优化后性能提升了好几个数量级,这些是不容忽视的。

 

消除循环终止判断时的方法调用

stratTime = System.nanoTime();  
for (int i = 0; i < list.size(); i++) {  
      
}  
endTime = System.nanoTime();  
System.out.println("未优化list耗时:"+(endTime - stratTime));  

应改为:

stratTime = System.nanoTime();  
int size = list.size();  
for (int i = 0; i < size; i++) {  
      
}  
endTime = System.nanoTime();  
System.out.println("优化list耗时:"+(endTime - stratTime));  


两者耗时对比:

未优化list耗时:27375  
优化list耗时:2444  

list.size()每次循环都会被执行一次,这无疑会影响程序的性能,所以应该将其放到循环外面,用一个变量来代替,优化前后的对比也很明显。

异常捕获

stratTime = System.nanoTime();  
for (int i = 0; i < 10000000; i++) {  
    try {  
    } catch (Exception e) {  
    }  
}  
endTime = System.nanoTime();  
System.out.println("在内部捕获异常耗时:"+(endTime - stratTime));  

应改为:

stratTime = System.nanoTime();  
try {  
    for (int i = 0; i < 10000000; i++) {  
    }  
} catch (Exception e) {  
  
}  
endTime = System.nanoTime();  
System.out.println("在外部捕获异常耗时:"+(endTime - stratTime));  

两者耗时对比:

在内部捕获异常耗时:12150142  
在外部捕获异常耗时:1955  


大家都知道,捕获异常是很耗资源的,所以不要讲try catch放到循环内部,优化后同样有好几个数量级的提升。

其它的编程语言也是同理!!!前后台适用。

为了优化 for 循环,可以考虑以下几种方法: 1. 使用迭代器代替下标循环:在循环中使用迭代器,而不是使用下标来访问列表元素,可以减少下标计算的开销,并且在处理大型列表时可以提高性能。 2. 避免重复计算:如果在循环中需要计算某些值,可以考虑在循环之前计算这些值,并将它们存储在变量中。这样可以避免在每次迭代时重复计算。 3. 合并循环:如果有多个循环迭代相同的列表,可以考虑将它们合并为一个循环,以减少循环的数量和访问列表的次数。 4. 使用并行化技术:如果循环中的计算可以并行执行,可以使用并行化技术,如多线程或多进程,以加速循环的执行。 5. 优化循环体内部的代码:循环体内部的代码也可能是性能瓶颈,可以使用一些优化技术来加速代码的执行,如使用更高效的算法或数据结构,减少内存分配和释放等。 下面是一个 for 循环优化的示例代码: ```python import time # 原始代码 start_time = time.time() sum = 0 for i in range(1000000): sum += i end_time = time.time() print("原始代码执行时间:", end_time - start_time) # 优化后的代码 start_time = time.time() sum = sum(range(1000000)) end_time = time.time() print("优化后的代码执行时间:", end_time - start_time) ``` 在上面的示例代码中,我们使用了内置函数 `sum` 来代替 for 循环来计算 0 到 999999 的和。这种方法比 for 循环更快,因为sum函数在 C 语言中实现,比 Python 解释器更快。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laizhixue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值