锁定老帖子 主题:循环的优化
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-22
循环的优化 --------------------------------------- 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()); */ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-10-22
把测试依据贴出来啊
|
|
返回顶楼 | |
发表时间:2008-10-23
到底能快多少?把这个测出来才更有说服力
毕竟有些优化还是以可读性降低为代价的 要测试比较过后才知道付出的代价是否值得 |
|
返回顶楼 | |
发表时间:2008-10-23
编译,然后反编译,熟悉字节码就知道怎样去优化你的代码,所谓的这些个技巧太多了,关键应该明白原理。
|
|
返回顶楼 | |
发表时间:2008-10-23
恩。这个只要开发经验多了 就知道效率问题了。但是底层的原理还是讲解一下比较好。
|
|
返回顶楼 | |
发表时间:2008-10-24
对于1的可读性确实不是很好,在循环Integer.MAX_VALUE后差别也是几百毫秒,实际运用中也许没人写这样的代码, 但是它确实可以优化性能,我们要认识这一点,知道为什么,我们要从美观和性能之间选择一个,说一段多余的话: 美观其实大部分是因为用的人多,看习惯了,对吗?哪个好,个人爱好啦 2,对于异常在循环内还是在外,比较建议的是:能放在外面就放在外面,异常也是代码更何况他的速度和JIT有暧昧。 345这里就不说了,如果看看我写的例子,想一想,应该不会很难理解。 为什么我不写测试数据?只是觉得复制粘贴特别简单,修修改改,然后就可运行。另外,这个博客是我个人写的一些总结, 结和个人的观点认识,积累一下,以后也方便查阅,并回想当时的认识,没想到这么多人观看评论,如果有什么不同观点,愿请赐教,嘻嘻 |
|
返回顶楼 | |
发表时间:2008-10-27
我觉得这些东西可以扩展知识面,但用处不大。
举个例子,访问二维数组的时候按行优先比按列优先效率要高,原因是所谓的局部性原理,可以充分利用计算机的高速缓存,可是这些东西对做java的企业应用有什么用处呢?反正我觉得没有什么用处。 |
|
返回顶楼 | |
发表时间:2008-10-28
lyy5271 写道 我觉得这些东西可以扩展知识面,但用处不大。举个例子,访问二维数组的时候按行优先比按列优先效率要高,原因是所谓的局部性原理,可以充分利用计算机的高速缓存,可是这些东西对做java的企业应用有什么用处呢?反正我觉得没有什么用处。 不敢苟同!如果仅仅是类似我文章类似1的优化,你的观点是正确的, 但是对于类似很多以下几个的优化,你的观点确实应该值得每一个认为无所为的程序员深思。 我们是写程序的,写出优秀的代码应该是我们共同的目标,不应当因系统的规模大小和难易程 度而改变我们的追求。当你看别人程序的时候,一个有很多年java开发经验的时候,你也许会 发现类似这样的拙劣:var.equals("123");,也许这样写是小事,可是我觉得这样写对于初学者 是可以原谅的……。回过头来看345,如果是企业应用,你的代码也许正在严重影响性能 一句话总结:无论你写的是什么样系统,都应该把你最好的代码写进去。 |
|
返回顶楼 | |
发表时间:2008-10-28
sunflowers 写道 lyy5271 写道 我觉得这些东西可以扩展知识面,但用处不大。举个例子,访问二维数组的时候按行优先比按列优先效率要高,原因是所谓的局部性原理,可以充分利用计算机的高速缓存,可是这些东西对做java的企业应用有什么用处呢?反正我觉得没有什么用处。 不敢苟同!如果仅仅是类似我文章类似1的优化,你的观点是正确的, 但是对于类似很多以下几个的优化,你的观点确实应该值得每一个认为无所为的程序员深思。 我们是写程序的,写出优秀的代码应该是我们共同的目标,不应当因系统的规模大小和难易程 度而改变我们的追求。当你看别人程序的时候,一个有很多年java开发经验的时候,你也许会 发现类似这样的拙劣:var.equals("123");,也许这样写是小事,可是我觉得这样写对于初学者 是可以原谅的……。回过头来看345,如果是企业应用,你的代码也许正在严重影响性能 一句话总结:无论你写的是什么样系统,都应该把你最好的代码写进去。 我觉得还是应该重申代码优化的核心理念,也就是先完成功能,进行性能测试,如果有问题才去优化,在大部分情况下,影响关键性能的都不是你认为他可能会影响性能的部分。所以这样的优化只是在对性能要求极其苛刻并且有充分的测试和编码时间的情况下才会去考虑的吧?^_^ |
|
返回顶楼 | |
发表时间:2008-10-28
WhisperXD 写道 sunflowers 写道 lyy5271 写道 我觉得这些东西可以扩展知识面,但用处不大。举个例子,访问二维数组的时候按行优先比按列优先效率要高,原因是所谓的局部性原理,可以充分利用计算机的高速缓存,可是这些东西对做java的企业应用有什么用处呢?反正我觉得没有什么用处。 不敢苟同!如果仅仅是类似我文章类似1的优化,你的观点是正确的, 但是对于类似很多以下几个的优化,你的观点确实应该值得每一个认为无所为的程序员深思。 我们是写程序的,写出优秀的代码应该是我们共同的目标,不应当因系统的规模大小和难易程 度而改变我们的追求。当你看别人程序的时候,一个有很多年java开发经验的时候,你也许会 发现类似这样的拙劣:var.equals("123");,也许这样写是小事,可是我觉得这样写对于初学者 是可以原谅的……。回过头来看345,如果是企业应用,你的代码也许正在严重影响性能 一句话总结:无论你写的是什么样系统,都应该把你最好的代码写进去。 我觉得还是应该重申代码优化的核心理念,也就是先完成功能,进行性能测试,如果有问题才去优化,在大部分情况下,影响关键性能的都不是你认为他可能会影响性能的部分。所以这样的优化只是在对性能要求极其苛刻并且有充分的测试和编码时间的情况下才会去考虑的吧?^_^ WhisperXD 写道 sunflowers 写道 lyy5271 写道 我觉得这些东西可以扩展知识面,但用处不大。举个例子,访问二维数组的时候 按行优先比按列优先效率要高,原因是所谓的局部性原理,可以充分利用计算机 的高速缓存,可是这些东西对做java的企业应用有什么用处呢?反正我觉得没有 什么用处。 不敢苟同!如果仅仅是类似我文章类似1的优化,你的观点是正确的, 但是对于类似很多以下几个的优化,你的观点确实应该值得每一个认为无所为的 程序员深思。 我们是写程序的,写出优秀的代码应该是我们共同的目标,不应当因系统的规模 大小和难易程 度而改变我们的追求。当你看别人程序的时候,一个有很多年java开发经验的时 候,你也许会 发现类似这样的拙劣:var.equals("123");,也许这样写是小事,可是我觉得这样 写对于初学者 是可以原谅的……。回过头来看345,如果是企业应用,你的代码也许正在严重影 响性能 一句话总结:无论你写的是什么样系统,都应该把你最好的代码写进去。 我觉得还是应该重申代码优化的核心理念,也就是先完成功能,进行性能测试, 如果有问题才去优化,在大部分情况下,影响关键性能的都不是你认为他可能会 影响性能的部分。所以这样的优化只是在对性能要求极其苛刻并且有充分的测试 和编码时间的情况下才会去考虑的吧?^_^ "我觉得还是应该重申代码优化的核心理念,也就是先完成功能",这句话我很赞同 ,我想也许你误会我的意思, 我说的优化并不是指对已经完成的项目或者正在做项目的时候花费大量的时间去考虑 怎样写才是最优代码,我的意思是做项目的时候,经验所及的条件下写出自己最优的代码, 或者平常吸取他人的经验,留意自己代码的质量,提高自己的水平,而不是刻意的对未完成的系统或者已经完成的系统 ,性能并不是瓶颈的时候去优化。 在做东西的时候应该像你说的那样:代码优化的核心理念,也就是先完成功能,进行性能测试。优化是在对性能要求苛 刻并且有充分的测试是才去考虑(Bruce Eckel好像也说过类似的话哦,呵呵) |
|
返回顶楼 | |