论坛首页 Java企业应用论坛

[表示怀疑]什么样的优化能让Java程序性能提高2.5倍?

浏览 39187 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-11-26  
flyingbugs 写道
建议学Java的兄弟,别老是整天玩概念搞框架,有空也去研究研究底层的东东,会对你们有很大帮助。我记得我用java的第二周,就开始负责系统的调优。我记得那回使用经过我改动的框架,系统的综合性能提高了2.5倍,某些模块甚至提高了100倍以上。过多的异常,不适当的new,不合理的过度设计....


我很怀疑:对这些东西的调优能让系统性能提高2.5倍?一个简单的计算就可以知道,如果仅仅通过Java内存操作的优化就能让系统性能提高2.5倍,那么在未经优化之前,内存操作的时间至少必须占到整体运行时间的60%以上(1/0.4=2.5)。在任何一个涉及I/O的任务中,难道内存操作会占到60%以上的时间?我很怀疑。所以我希望flyingbugs详细讲讲这个系统以及你的优化策略,尤其需要注意的是:你的优化本质上是不是减少了I/O次数,或者针对算法密集型操作(例如加密)改变了算法。
   发表时间:2004-11-26  
他的意思是用Java的人不懂底层,所以写出来的Java代码比较烂,如果懂得了底层,写出来的Java代码就比较牛,可以提供甚至100倍效率。我的建议是gigix先给出来一段经过过度设计的Java代码,大量使用new来创建对象,然后我再附以大量的CheckedExcpetion来控制异常事件流,然后让flyingbugs进行深度优化,以达到2.5-100倍的提高。

注意:仅仅是优化Java代码,不能去优化外部环境,例如数据库,操作系统,JVM等等,否则我就是升级Linux Kernel,网络性能都有好几倍的提升了。
0 请登录后投票
   发表时间:2004-11-26  
题外话:
优化的第一原则:不要优化
优化的第二原则:还是不要优化

就不明白Java上什么算底层优化,是希望指点一下
0 请登录后投票
   发表时间:2004-11-26  
优化对象不同而已。
优化某些人的程序,别说提高2.5倍,100倍都是正常的。
但是优化高水平的程序,提高0.025倍都很困难。
0 请登录后投票
   发表时间:2004-11-26  
robbin 写道
我的建议是gigix先给出来一段经过过度设计的Java代码,大量使用new来创建对象,然后我再附以大量的CheckedExcpetion来控制异常事件流,然后让flyingbugs进行深度优化,以达到2.5-100倍的提高。


呵呵,这个说实话挺难的,还真要了解JVM底层才行。因为你不能光是大量new对象,你还得想办法长时间保存这些对象的HardReference,不然new出来的对象进不了“老一代”的内存区,很快就被GC了,而且“新一代”的GC是非常之快的。从这里又引出另一个话题:很多“熟悉底层”的人会说,你们少new点对象,多用点pool,可以提高性能。但实际上,如果对象初始化没有额外的工作,pool的性能比“new大量对象”要来得低。
0 请登录后投票
   发表时间:2004-11-26  
flyingbugs的优化对象不是高手或者低手写出来的代码,flyingbus的优化对象要具备如下条件:

喜欢用new;
喜欢过度设计;
喜欢用CheckedException;
不懂Java的底层原理

不才区区在下就是符合这样的条件,对了,我前面写了一个简单对象的CRUD操作的Demo,不妨给我优化优化,提高2.5倍效率我就很满足了。
http://forum.iteye.com/viewtopic.php?t=8857
1 请登录后投票
   发表时间:2004-11-26  
哈 你能保证你得系统都是高手写代码????

呵呵

是的 我优化得系统中 很多不是java高手所写得啊!

难道你们的代码都是robbin这样的大拿写的??
0 请登录后投票
   发表时间:2004-11-26  
还有 就是算法的问题:

很多时候 算法的不恰当 导致程序运行效率数量级的差异。

前些天李维的讲座,和他讨论了这个问题。关于优化我和它有不同的见解. 他更强调java代码本身的(jvm相关)的优化,我觉得 往往算法导致效率成倍的改变。也许这些算法很少地方出现,但往往出现在最关键的的地方。

举个例子,以前一个项目实现一个这样的功能:将二进制代码转为String输出(每个byte对应一个字节,根据一定的编码),这个东东几乎每次处理都要用到,我们的项目成员从开源的一个东东中搞了一个这样的函数。效率十分的低,无法忍受!
后来仔细的看了它的实现,它用的是一个算法,来实现映射,该算法比较复杂,占用cpu资源很大,而且我们一次处理至少就是好几百k的数据,很显然 这样的算法就是不合适的。
后来我们这样解决这个问题:把该编码整个的映射存在内存中,在转换时直接的内存寻址操作。这样花了不少内存(大概20M左右把),但cpu的使用却减少了100多倍。这就是 用空间换时间。
0 请登录后投票
   发表时间:2004-11-26  
robbin:我批评过你的所谓 Exception 理论。但你也不用这样来讽刺和嘻弄我啊。

难道“吃生”是你的论坛的特点??

还有,为什么听人说 你的这个javaeye不喜欢初学者?
难道你生来就是高手?

尺有所短 寸有所长,java水平不如你的人 也不见到不会有比你强的地方。有些思想和见解说不定就比你的更加接近真理。为什么不用一种开放的思想来对待呢?

你去看看C/C++论坛,很多人问很多高手看来幼稚的问题,但还是很多高手耐心的回答啊!
0 请登录后投票
   发表时间:2004-11-26  
robbin:
引用
喜欢用new;
喜欢过度设计;
喜欢用CheckedException;
不懂Java的底层原理

不才区区在下就是符合这样的条件,对了,我前面写了一个简单对象的CRUD操作的Demo,不妨给我优化优化,提高2.5倍效率我就很满足了。


你这不是存心抬杠么??
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics