论坛首页 Java企业应用论坛

透过JVM看Exception本质

浏览 42186 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-01-03  
IcyFenix 写道
看看反应如何,好的话明天再写一篇来小淌一下“C/C++会比Java语言快多少多少倍”这浑水,也是这2天由那几张判断字符串能不能用异常的帖子中看到的观点。


望有深入解读!
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2011-01-03  
云里雾里.......   JVM   归根还是C ...   汇编....
0 请登录后投票
   发表时间:2011-01-03  
新的一年里看到分析的这么有深度的帖子,平静地拜读。
0 请登录后投票
   发表时间:2011-01-03   最后修改:2011-01-03
楼主分析的很透彻, 个人感觉exception在控制程序结构好点,性能没出现瓶颈不在乎那点
0 请登录后投票
   发表时间:2011-01-03  
该用就用。
0 请登录后投票
   发表时间: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行代码,说这样的话:“我只在赶进度时,才用异常做判断”。这想法很有意思,为什么没人思考,我这样用了,但为什么软件没有出问题...
0 请登录后投票
   发表时间:2011-01-04  
meiyoudao 写道
云里雾里.......   JVM   归根还是C ...   汇编....

机器码。
0 请登录后投票
   发表时间:2011-01-04  
IcyFenix 写道
看看反应如何,好的话明天再写一篇来小淌一下“C/C++会比Java语言快多少多少倍”这浑水,也是这2天由那几张判断字符串能不能用异常的帖子中看到的观点。


这个最好还是别写,坑太大了。
而且他们性能之间的差距并不是由c++ 或 java语言本身所带来的,而是由于他们的实际编译器/虚拟机在做代码生成的时候,对代码优化的程度所带来的。

所以你要写的话,也是要深入各主流cpp编译器来写,写得不好就口水战了。
0 请登录后投票
   发表时间: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比我的跑的快不少?






0 请登录后投票
论坛首页 Java企业应用版

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