锁定老帖子 主题:透过JVM看Exception本质
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-03
IcyFenix 写道 看看反应如何,好的话明天再写一篇来小淌一下“C/C++会比Java语言快多少多少倍”这浑水,也是这2天由那几张判断字符串能不能用异常的帖子中看到的观点。
望有深入解读! |
|
返回顶楼 | |
发表时间:2011-01-03
最后修改:2011-01-04
在mac下又做了一次测试。下面是源码:
import java.util.ArrayList; import java.util.Iterator; public class F{ public static void main(String[] args){ ArrayList a0=null; ArrayList a1=null; long t0=0; long t1=0; long t2=0; long t3=0; long l=0; int[] t={10,100,1000,10000,100000}; int sum=0; int lt=t.length; for(int i=0;i<lt;i++){ l=t[i]; sum=0; for(int j=0;j<l;j++){ System.out.print("\b\b\b\b\b\b\b\b\b\b"+j); a0=new ArrayList(); for(int k=0;k<j;k++){ a0.add(""+k); } a1=new ArrayList(); Iterator it=a0.iterator(); t0=System.nanoTime(); while(it.hasNext()){ a1.add(it.next()); } t1=System.nanoTime(); t2=t1-t0; a1=new ArrayList(); it=a0.iterator(); t0=System.nanoTime(); try{ while(true){ a1.add(it.next()); } }catch(Exception e){ t1=System.nanoTime(); } t3=t1-t0; if(t2<t3){ sum++; } } System.out.println("\b\b\b\b\b\b\b\b\b\bStatics="+sum+"/"+l); } } } 下面是结果: statistics=9/10 statistics=82/100 statistics=628/1000 statistics=2608/10000 statistics=11865/100000 很有意思的结果。在10000次循环的时候,hasNext()方式用时少的test有26%,比Exception的方式少,而且少了很多。在100,000次循环的时候,hasNext()方式用时少的test只有不到12%。 在mac下,如果循环次数少(1000左右)的话,hasNext()方式好些,如果循环次数多(10K以上)的循环,Exception方式好些。 后来又换了台稍微好点的机器运行,下面是测试结果。 statistics=10/10 statistics=89/100 statistics=89/1000 statistics=115/10000 statistics=1233/100000 |
|
返回顶楼 | |
发表时间:2011-01-03
云里雾里....... JVM 归根还是C ... 汇编....
|
|
返回顶楼 | |
发表时间:2011-01-03
新的一年里看到分析的这么有深度的帖子,平静地拜读。
|
|
返回顶楼 | |
发表时间:2011-01-03
最后修改:2011-01-03
楼主分析的很透彻, 个人感觉exception在控制程序结构好点,性能没出现瓶颈不在乎那点
|
|
返回顶楼 | |
发表时间:2011-01-03
该用就用。
|
|
返回顶楼 | |
发表时间:2011-01-04
最后修改:2011-01-04
skzr.org 写道 呵呵,抛个问题给大家:
1 String判断是不是能转换为合法的Integer这么纠结 2 String判断是不是能转换为合法的json是不是也要争论下 3 String判断是不是能转换为合法的xml document是不是也要争论下 4 String判断是不是能转换为合法的your bean是不是更加要纠结下! 。。。 X String判断是不是能转换为合法的Application是不是更加要纠结下! 相信大家思索后各有定论! 引申的很棒。不能用僵化的思维来理解软件的各个方面。拿着死的规则生般硬套,什么都是非对即错。最终会发现,软件中不能付合规则的地方多了, 可是却是合理的。 达不到这个思维水平,如何在软件设计时选择恰当的解决方案? 对于性能问题,最忌拍脑门。如若没有量化的数字,说性能问题,那就是扯蛋。我遇过几次性能瓶颈的排查,没有一次是能通过看代码找到问题的。我不是说代码对软件性能没影响,只是很多人都在这上想多了。软件中一段,一年只会运行一次的代码(我是指一般的业务逻缉,比如更新个字段、生成个报表什么的...),只要不是顾意是很难写出性能问题的... 而软件中被频繁执行的代码,才有出现性能问题的可能。 所以,软件要追求的是可读。因为可读,意味着可改,如果真在哪个味预料的位置出现了性能瓶颈,即可重构之... 有人看了我那6行代码,说这样的话:“我只在赶进度时,才用异常做判断”。这想法很有意思,为什么没人思考,我这样用了,但为什么软件没有出问题... |
|
返回顶楼 | |
发表时间:2011-01-04
meiyoudao 写道 云里雾里....... JVM 归根还是C ... 汇编....
机器码。 |
|
返回顶楼 | |
发表时间:2011-01-04
IcyFenix 写道 看看反应如何,好的话明天再写一篇来小淌一下“C/C++会比Java语言快多少多少倍”这浑水,也是这2天由那几张判断字符串能不能用异常的帖子中看到的观点。
这个最好还是别写,坑太大了。 而且他们性能之间的差距并不是由c++ 或 java语言本身所带来的,而是由于他们的实际编译器/虚拟机在做代码生成的时候,对代码优化的程度所带来的。 所以你要写的话,也是要深入各主流cpp编译器来写,写得不好就口水战了。 |
|
返回顶楼 | |
发表时间:2011-01-04
william_ai 写道 在mac下又做了一次测试。下面是源码:
import java.util.ArrayList; import java.util.Iterator; public class F{ public static void main(String[] args){ ArrayList a0=null; ArrayList a1=null; long t0=0; long t1=0; long t2=0; long t3=0; long l=0; int[] t={10,100,1000,10000,100000}; int sum=0; int lt=t.length; for(int i=0;i<lt;i++){ l=t[i]; sum=0; for(int j=0;j<l;j++){ System.out.print("\b\b\b\b\b\b\b\b\b\b"+j); a0=new ArrayList(); for(int k=0;k<j;k++){ a0.add(""+k); } a1=new ArrayList(); Iterator it=a0.iterator(); t0=System.nanoTime(); while(it.hasNext()){ a1.add(it.next()); } t1=System.nanoTime(); t2=t1-t0; a1=new ArrayList(); it=a0.iterator(); t0=System.nanoTime(); try{ while(true){ a1.add(it.next()); } }catch(Exception e){ t1=System.nanoTime(); } t3=t1-t0; if(t2<t3){ sum++; } } System.out.println("\b\b\b\b\b\b\b\b\b\bStatics="+sum+"/"+l); } } } 下面是结果: Statics=9/10 Statics=82/100 Statics=628/1000 Statics=2608/10000 Statics=11865/100000 很有意思的结果。在10000次循环的时候,hasNext()方式用时少的test有26%,比Exception的方式少,而且少了很多。在100,000次循环的时候,hasNext()方式用时少的test只有不到12%。 在mac下,如果循环次数少(1000左右)的话,hasNext()方式好些,如果循环次数多(10K以上)的循环,Exception方式好些。 猪头啊, 性能测试的时候不要在控制台上输出太多, 最好只输出结果。 还有, 预热部分代码要先跑一些。 (jit的问题) system.nanoTime 不要这么用, 一个一个点的统计, 这个函数是系统调用, 而且很消耗, sys/usr切换是消耗的。 总之你这个测试不是很准。 为毛你的mac比我的跑的快不少? |
|
返回顶楼 | |