- 浏览: 459919 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
a464697691:
楼主厉害,现在可以使用了
Proxool houseKeepingSleepTime bug修正 -
chenpi529:
楼主好牛逼
Proxool houseKeepingSleepTime bug修正 -
huangxinyu_it:
多谢楼主了
Proxool houseKeepingSleepTime bug修正 -
kokorodo:
谢谢了!
zk中文开发手册pdf版(基于3.5.1) -
superscorpio:
public void testImportInContex ...
MVEL2.0控制流
循环的优化 --------------------------------------- 1,数字比较尽量和0比较 注释:计算机喜欢0和1 //foo for(int i=0;i<Integer.MAX_VALUE;i++){ //慢 } //优化 for(int i=Integer.MAX_VALUE;i>0;i--){ //快 } 2,尽量把异常捕获写在外面 //foo for(int i=180000;i>=0;i--){ try{ //慢 }catch{ } } //优化 try{ for(int i=180000;i>=0;i--){ //快 } }catch{ } --------------------------------------- 3,尽量不要在循环内有多余的方法调用 //注释:除了方法调用本身耗费资源外,其方法内代码体的多次执行根据实际情况影响性能和内存,调用一次能解决问题就别调用两次 for(int i=0;i>=IntMethod();i--){ } //优化 int len = IntMethod(): for(int i=0;i>=len;i--){ } --------------------------------------- 4, 在循环中最好不要拼接字符串一 注释:String是不变类,对其更改都会重新创建字符串,从而导致内存和速 度的问题, 另外StringBuilder是sun为解决字符串操作效率低下而创建 地(StringBuffer早), 有字符buffer,解决字符的增删改都是相当快滴 //foo String str = ""; for (int i = 0; i >= 18000; i--) { // 慢 占用内存大 str += "慢 占用内存大"; } //优化 StringBuilder yourString = new StringBuilder(); for (int i = 0; i >= 18000; i--) { // 快 占用内存小 yourString.append("快 占用内存小"); } --------------------------------------- 5, 在循环中最好不要拼接字符串之二 注释:看编译后代码,一目了然 //foo StringBuilder yourString = new StringBuilder(); for (Integer i = 0; i >= 18000; i--) { yourString.append("" + i); } // 优化 for (Integer i = 0; i >= 18000; i--) { yourString.append(i.toString()); } //编译后代码 注:经过处理 /* //foo StringBuilder yourString = new StringBuilder(); for (Integer i = Integer.valueOf(0); i.intValue() >= 18000; i = Integer.valueOf(i.intValue() - 1)) yourString.append((new StringBuilder()).append(i).toString()); // 优化 for (Integer i = Integer.valueOf(0); i.intValue() >= 18000; i = Integer.valueOf(i.intValue() - 1)) yourString.append(i.toString()); */
评论
43 楼
yf42
2009-09-25
第一条的理解有问题,貌似不是因为比较的原因(想不明白跟0比为什么会快),是cpu少一次计算的问题(汇编忘的差不多了,不过好像是循环用+是3条指令,-是2条指令)
42 楼
zhaomingzm_23
2009-09-23
oxromantic 写道
sunflowers 写道
jieping310 写道
var.equals("123");这个有什么问题?
var是个变量,变量就有可能为null,而"123"是个常量,永远都不可能给为null
所以字符串比较时,标准的写法应该是"123".equals(var);
var.equals("123")才是标准的写法,"123".equals(var)会吃掉空指针的异常情况
对于任何一个稳健的系统而言,更期待的是抛出异常而不是吃掉异常
"123".equals(var)受早期精简代码的影响,现在想来不可取
个人理解:优秀的代码往往是冗余的
ps:
var.equals("123")这种写法完全可以由jvm优化,好像新的jdk已经包含相关的feature
其实这个var.equals("123")的问题要看上下文
如果人家在var.equals("123")之前已经 if(var == null) return;了呢?
还有就是我们是中国人主语靠前的程序容易阅读。我们写程序不是给机器看的,是给人看的。看过《实现模式》的朋友应该知道程序代码交流的重要性.
PS:在Groovy中可以这样避免这个问题 var?.equal("123"),带上这个问号,编译器会处理null value invoke.
以上个人见解,呵呵
41 楼
oxromantic
2008-12-24
sunflowers 写道
jieping310 写道
var.equals("123");这个有什么问题?
var是个变量,变量就有可能为null,而"123"是个常量,永远都不可能给为null
所以字符串比较时,标准的写法应该是"123".equals(var);
var.equals("123")才是标准的写法,"123".equals(var)会吃掉空指针的异常情况
对于任何一个稳健的系统而言,更期待的是抛出异常而不是吃掉异常
"123".equals(var)受早期精简代码的影响,现在想来不可取
个人理解:优秀的代码往往是冗余的
ps:
var.equals("123")这种写法完全可以由jvm优化,好像新的jdk已经包含相关的feature
40 楼
sunflowers
2008-11-05
zgd 写道
拼接字符串的就不用说了。第一条,我不信编译器或者JVM没有帮你优化第二条,两个代码的行为不一样啊
你不信:是你的主观愿望,要真正测试才可以,第一条我已经说过,意义不大,
对于参加异常讨论的朋友,我有句话,非常严重的告诉你
【编译器编译的时候要对语句进行语法分析的】,所以你在编译我的事例的时候,也要分析我的语法,我前面有个词语【尽量】,不知道你们分析到了没有,如果你们没有分析到,所以,你们会报异常的,由此,我来写这个帖子来捕获你们的异常来了,O(∩_∩)O哈哈~,开个玩笑,do,do do
39 楼
iwalyx
2008-11-04
受教了,不过个人感觉,除了研究所以外,做的东西都是给客户或客人的.
38 楼
zgd
2008-11-04
拼接字符串的就不用说了。
第一条,我不信编译器或者JVM没有帮你优化
第二条,两个代码的行为不一样啊
第一条,我不信编译器或者JVM没有帮你优化
第二条,两个代码的行为不一样啊
37 楼
delphixp
2008-11-04
taupo 写道
try{
for(int i=180000;i>=0;i--){
//快
}
}catch{
}
按楼主这样做有个很大的问题。。。。如果i=100的时候抛了异常,100以后的就不能继续循环了。。。
for(int i=180000;i>=0;i--){
//快
}
}catch{
}
按楼主这样做有个很大的问题。。。。如果i=100的时候抛了异常,100以后的就不能继续循环了。。。
那是当然的,楼主所说的是,当有异常时,循环就中断的话,最好将 try{}catch() 放在循环的外面。但,如果出现异常时,仍不能中断循环时,则 try..catch 就不能放在外面了。。。
36 楼
taupo
2008-11-04
try{
for(int i=180000;i>=0;i--){
//快
}
}catch{
}
按楼主这样做有个很大的问题。。。。如果i=100的时候抛了异常,100以后的就不能继续循环了。。。
for(int i=180000;i>=0;i--){
//快
}
}catch{
}
按楼主这样做有个很大的问题。。。。如果i=100的时候抛了异常,100以后的就不能继续循环了。。。
35 楼
sunflowers
2008-11-04
freish 写道
即使是3那样的代码,java编译器应该做了优化了吧,如果这样的代码都不能优化,那编译器也够失败的了
34 楼
freish
2008-11-04
即使是3那样的代码,java编译器应该做了优化了吧,如果这样的代码都不能优化,那编译器也够失败的了
33 楼
guooscar
2008-11-01
传递的参数是null,是否意味着有错误呢
呵呵 让我想起了 鸵鸟算法
呵呵 让我想起了 鸵鸟算法
32 楼
sunflowers
2008-10-31
还有一个小小的好处是,此时的var 可以是任何对象
即使是null
呵呵
即使是null
呵呵
31 楼
sunflowers
2008-10-31
jieping310 写道
我只要先做个判断就可以啊
var != null && var.equals("123")这样跟 "123".equals(var);性能上有很大区别么?
两者的性能差别不是太大,
你的判断完全可以省略,
变成简洁、高效、易读的 "123".equals(var)【相比较你的判断】;
这种问题自己在平时可以注意一下,稍微思考,应该不是问题
30 楼
jieping310
2008-10-31
sunflowers 写道
jieping310 写道
var.equals("123");这个有什么问题?
var是个变量,变量就有可能为null,而"123"是个常量,永远都不可能给为null
所以字符串比较时,标准的写法应该是"123".equals(var);
我只要先做个判断就可以啊
var != null && var.equals("123")这样跟 "123".equals(var);性能上有很大区别么?
29 楼
WhisperXD
2008-10-31
sunflowers 写道
jieping310 写道
var.equals("123");这个有什么问题?
var是个变量,变量就有可能为null,而"123"是个常量,永远都不可能给为null
所以字符串比较时,标准的写法应该是"123".equals(var);
这个学到了:)。。
28 楼
sunflowers
2008-10-31
jieping310 写道
var.equals("123");这个有什么问题?
var是个变量,变量就有可能为null,而"123"是个常量,永远都不可能给为null
所以字符串比较时,标准的写法应该是"123".equals(var);
27 楼
jieping310
2008-10-31
sunflowers 写道
lyy5271 写道
我觉得这些东西可以扩展知识面,但用处不大。举个例子,访问二维数组的时候按行优先比按列优先效率要高,原因是所谓的局部性原理,可以充分利用计算机的高速缓存,可是这些东西对做java的企业应用有什么用处呢?反正我觉得没有什么用处。
不敢苟同!如果仅仅是类似我文章类似1的优化,你的观点是正确的,
但是对于类似很多以下几个的优化,你的观点确实应该值得每一个认为无所为的程序员深思。
我们是写程序的,写出优秀的代码应该是我们共同的目标,不应当因系统的规模大小和难易程
度而改变我们的追求。当你看别人程序的时候,一个有很多年java开发经验的时候,你也许会
发现类似这样的拙劣:var.equals("123");,也许这样写是小事,可是我觉得这样写对于初学者
是可以原谅的……。回过头来看345,如果是企业应用,你的代码也许正在严重影响性能
一句话总结:无论你写的是什么样系统,都应该把你最好的代码写进去。
var.equals("123");这个有什么问题?
26 楼
leirdal
2008-10-30
BenoWay 写道
for(int i=0;i<Integer.MAX_VALUE;i++){
//慢
}
//优化
for(int i=Integer.MAX_VALUE;i>=0;i--){
//快
}
这个循环次数一样吗?
//慢
}
//优化
for(int i=Integer.MAX_VALUE;i>=0;i--){
//快
}
这个循环次数一样吗?
下面多了一次循环。
25 楼
leirdal
2008-10-30
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
compare();
}
}
static void compare(){
final int MAX = 10000000;
long start = System.currentTimeMillis();
for (int i = 0; i < MAX; i++) {
}
System.out.println("end == " + (System.currentTimeMillis() - start));
long start1 = System.currentTimeMillis();
for (int k = MAX; k > 0; k--) {
}
System.out.println("end == " + (System.currentTimeMillis() - start1));
System.out.println("====================================");
}
结果:
end == 47
end == 31
====================================
end == 16
end == 31
====================================
end == 16
end == 31
====================================
end == 15
end == 32
====================================
end == 15
end == 32
====================================
end == 15
end == 31
====================================
end == 16
end == 31
====================================
end == 16
end == 31
====================================
end == 16
end == 31
====================================
end == 31
end == 16
====================================
end == 31
end == 16
====================================
end == 31
end == 16
====================================
end == 31
end == 15
====================================
end == 32
end == 15
====================================
end == 32
end == 31
====================================
end == 15
end == 32
====================================
end == 15
end == 32
====================================
end == 15
end == 31
====================================
end == 16
end == 31
====================================
end == 16
end == 31
====================================
for (int i = 0; i < 20; i++) {
compare();
}
}
static void compare(){
final int MAX = 10000000;
long start = System.currentTimeMillis();
for (int i = 0; i < MAX; i++) {
}
System.out.println("end == " + (System.currentTimeMillis() - start));
long start1 = System.currentTimeMillis();
for (int k = MAX; k > 0; k--) {
}
System.out.println("end == " + (System.currentTimeMillis() - start1));
System.out.println("====================================");
}
结果:
end == 47
end == 31
====================================
end == 16
end == 31
====================================
end == 16
end == 31
====================================
end == 15
end == 32
====================================
end == 15
end == 32
====================================
end == 15
end == 31
====================================
end == 16
end == 31
====================================
end == 16
end == 31
====================================
end == 16
end == 31
====================================
end == 31
end == 16
====================================
end == 31
end == 16
====================================
end == 31
end == 16
====================================
end == 31
end == 15
====================================
end == 32
end == 15
====================================
end == 32
end == 31
====================================
end == 15
end == 32
====================================
end == 15
end == 32
====================================
end == 15
end == 31
====================================
end == 16
end == 31
====================================
end == 16
end == 31
====================================
24 楼
BenoWay
2008-10-30
for(int i=0;i<Integer.MAX_VALUE;i++){
//慢
}
//优化
for(int i=Integer.MAX_VALUE;i>=0;i--){
//快
}
这个循环次数一样吗?
//慢
}
//优化
for(int i=Integer.MAX_VALUE;i>=0;i--){
//快
}
这个循环次数一样吗?
发表评论
-
什么是Method.isBridge方法
2010-11-18 14:22 3387什么是Method.isBridge方法: ... -
深入讨论Java开发异常的处理
2010-09-19 13:20 6095深入讨论Java开发异常的处理 (深刻讨 ... -
在参数中使用方法时需要注意的问题
2010-08-11 15:41 929/** * 判断虚拟路径的文件是否存在 ... -
判断String是否为空的小技巧
2010-06-25 09:02 17127//比较 方法一,大多数 ... -
IOException while loading persisted sessions: java.io.EOFException异常的解决办法
2010-06-21 10:39 2410严重: IOException while loadin ... -
log4j输出位置配置
2010-05-12 16:41 2411附件内有文件 log4j.rootLogg ... -
java日期时间工具类
2010-04-19 16:11 6502该片文章为重复造轮子,在commons-lang里有日期转换 ... -
MSSQL导致java.net.BindException异常的解决方法
2010-04-15 09:26 2163昨天同事写了一个程序,使用jdbc频繁访问数据库,导致MSSQ ... -
传值传引用,老问题了
2010-04-13 16:31 1067今天犯了一个错误: 例如: public class ... -
Proxool houseKeepingSleepTime bug修正
2009-12-09 09:25 11174修正后jar包在附件内 异常代码: Ca ... -
一个Java程序员应该掌握的10项技能[转]
2009-11-10 21:08 1121一个Java程序员应该掌握的10项技能[转] 1、 ... -
jdk自带工具使用指南
2009-09-19 23:53 1207jdk自带工具使用指南 http://java.sun ... -
类初始化陷阱(续)
2009-08-04 01:58 1245对于前一篇文章http://sunflowers.iteye ... -
jforum2.1.8版本的bug
2009-05-15 00:47 1698转载请注明出处(文章末尾虚线内容必须保留) ... -
java资料经典集合
2009-05-04 19:36 1587本文不断更新,转载请注明出处(文章末尾虚线内容必须保留) ... -
jforum 版主设置
2009-04-20 00:06 4729原文:http://www.trydone.com/p ... -
父类构造多态调用的陷阱
2008-10-22 13:07 1334class Parent { public Paren ...
相关推荐
### 多重For循环优化分析 #### 原始代码分析 原始代码示例如下: ```java for(int i = 0; i ; i++) { for(int j = 0; j ; j++) { for(int k = 0; k ; k++) { log(i * j * k); } } } ``` 此段代码中的嵌套循环...
特别是在使用C#进行开发时,循环优化对于提升程序运行效率至关重要。本文将深入探讨C#中的循环优化技术,并通过实例分析两种不同的循环写法来揭示其对性能的影响。 首先,我们要明白,循环是编程中最常见的一种控制...
易语言源码易语言循环优化源码.rar 易语言源码易语言循环优化源码.rar 易语言源码易语言循环优化源码.rar 易语言源码易语言循环优化源码.rar 易语言源码易语言循环优化源码.rar 易语言源码易语言循环优化源码....
本主题聚焦于“易语言循环优化”,这是一项提升程序性能的关键技术,特别是在处理大数据量或者长时间运行的任务时,有效的循环优化能显著减少计算时间和资源消耗。 循环是程序中最常见的结构之一,用于执行重复任务...
C++循环冒泡法优化 在看到for循环冒泡排序(c++) 后 再次优化了一下,它的程序不能运行,我运行优化的成功了,对初学者理解有很大帮助(还有注释)
循环优化是提升程序性能的关键策略之一,特别是在CPU指令缓存机制下,优化循环结构能够显著减少计算时间。本文主要探讨了几种循环优化技术,旨在帮助程序员编写更高效的代码。 首先,充分分解小的循环是利用CPU指令...
水循环优化算法(Water Cycle Algorithm, WCA)是这些算法中的一种,灵感来源于地球上自然界的水循环过程。这个算法在解决工程问题,特别是在优化设计、参数估计和机器学习等领域中有着广泛的应用。 水循环优化算法...
在MATLAB开发中,循环优化是一项关键技能,它旨在提高代码执行效率,减少计算时间,尤其是在处理大数据集或复杂计算时。本主题将深入探讨如何通过优化循环来提升MATLAB程序的性能。以下是对给定文件中可能涉及的几个...
程序分析与优化 - 循环优化 循环优化是程序分析与优化中非常重要的一步,对性能提升的效果非常明显。循环优化的逻辑相对简单,但对性能提升的效果却非常明显。本章主要介绍了循环的分析方法和优化技术。 6.1 循环...
下面将详细介绍标题及描述中提到的几个循环优化技巧: 1. **数字比较尽量和0比较** 在Java中,当进行数值比较时,如果可能的话,应尽可能地将其中一个值设置为0来进行比较。这是因为大多数处理器在处理与0的比较...
在编程领域,循环优化是提高程序性能的关键技术之一。PPT课件《程序的循环优化方法》探讨了如何通过各种策略提升循环效率,特别是在并行计算和指令级并行(ILP)方面。以下是该课件中涉及的主要知识点: 1. **循环...
循环优化是程序性能提升的关键技术,特别是在处理大数据集或计算密集型任务时。在编程中,循环是最常见的结构之一,优化循环可以显著提高程序运行效率。以下是对"程序的循环优化方法学习教案.pptx"内容的详细解读: ...
以下将分别探讨其中的关键知识点:数学建模工具箱、程式设计与应用、教程、循环优化。 1. **数学建模工具箱** Matlab的数学建模工具箱是进行科学研究和工程计算的重要辅助工具。它提供了丰富的函数库,涵盖了线性...
水循环优化算法 (Water Cycle Algorithm, WCA) 是一种基于自然界水循环过程的元启发式优化算法,由Shah-Hosseini于2012年提出。WCA通过模拟水滴在河流、湖泊和海洋中的流动过程,以及蒸发和降雨等自然现象,来搜索最...
在编程领域,循环优化是提高程序性能的关键技术之一。这篇PPT的学习教案主要探讨了如何对程序中的循环进行优化,以实现更好的并行性、内存管理和指令级并行(ILP)。以下是根据PPT内容提炼出的相关知识点: 1. 循环...
【基于循环优化的可重构处理器任务编译器设计实现】主要关注的是在可重构处理器系统中的任务编译器设计,这种编译器是粗粒度可重构处理器的关键组成部分。文章提出了一个针对REMUS-II可重构处理器架构的优化编译方法...
"易语言循环优化源码"是针对易语言中的循环结构进行性能提升的一种技术实践,它涉及到程序设计中的效率问题,尤其是在处理大数据量或者需要反复执行的代码块时,优化循环就显得尤为重要。 在易语言中,循环结构主要...
本文以一个实际案例出发,探讨如何优化Python的for循环以提高程序效率。 一、问题背景 在项目初期,由于用户数量较少,使用了两层嵌套的for循环来完成计算任务,耗时1-2小时。然而,随着用户基数的增长,项目运行...