`

java Exception 性能问题

    博客分类:
  • java
 
阅读更多

依稀还记得,try{}之后的代码块应尽量越少越好,难道代码被try{}catch(){}包围之后会降低运行效率吗?

测试一下:

package exception;

public class TestTry_Catch
{

	public static boolean try_catch()
	{
		try
		{
			return true;
		} catch (Exception e)
		{
			return false;
		}
	}

	public static boolean no_try_catch()
	{
		return true;
	}

	public static void main(String[] args)
	{
		long current1 = System.currentTimeMillis();
		long time = 10000000000l;
		for (long i = 0l; i < time; i++)
			try_catch();
		long current2 = System.currentTimeMillis();
		for (long j = 0l; j < time; j++)
			no_try_catch();
		long current3 = System.currentTimeMillis();
		System.out.println("try_catch time : " + (current2 - current1) + " ms");
		System.out.println("no_try_catch time : " + (current3 - current2) + " ms");
	}

}

 下面是console输出:

try_catch time : 4843 ms
no_try_catch time : 4683 ms

 这么多次,相差依然很小,在不会发生异常的情况下try_catch方法和no_try_catch方法运行的时间基本相差无几,在即时编译时try_catch方法比no_try_catch方法应花费稍多时间

 

下面再看一个更有趣的,当把return type改为void 时,代码:

package exception;

public class TestTry_Catch
{

	public static void try_catch()
	{
		try
		{
			// return true;
		} catch (Exception e)
		{
			// return false;
		}
	}

	public static void no_try_catch()
	{
		// return true;
	}

	public static void main(String[] args)
	{
		long current1 = System.currentTimeMillis();
		long time = 10000000000l;
		for (long i = 0l; i < time; i++)
			try_catch();
		long current2 = System.currentTimeMillis();
		for (long j = 0l; j < time; j++)
			no_try_catch();
		long current3 = System.currentTimeMillis();
		System.out.println("try_catch time : " + (current2 - current1) + " ms");
		System.out.println("no_try_catch time : " + (current3 - current2) + " ms");
	}

}

 console 输出:

try_catch time : 4772 ms
no_try_catch time : 4918 ms

 try_catch 比no_try_catch花费的时间更少了,这该怎样解释呢?

 

让方法进行一些计算吧,不去创建对象,因为可能会触发GC,只是去计算一下1+1

package exception;

public class TestTry_Catch
{

	public static void try_catch()
	{
		try
		{
			int a = 1 + 1;
			int b = a + 3;
		} catch (Exception e)
		{
			// return false;
		}
	}

	public static void no_try_catch()
	{
		int a = 1 + 1;
		int b = a + 3;
	}

	public static void main(String[] args)
	{
		long current1 = System.currentTimeMillis();
		long time = 10000000000l;
		for (long i = 0l; i < time; i++)
			try_catch();
		long current2 = System.currentTimeMillis();
		for (long j = 0l; j < time; j++)
			no_try_catch();
		long current3 = System.currentTimeMillis();
		System.out.println("try_catch time : " + (current2 - current1) + " ms");
		System.out.println("no_try_catch time : " + (current3 - current2) + " ms");
	}

}

 console输出:

try_catch time : 4957 ms
no_try_catch time : 4934 ms

 

我开始怀疑 try{}catch(){}代码块越短越好 这句话的正确性了

 

下面测一下异常对象产的的耗时和普通对象产生的耗时比较:

 

package exception;

import exception.entity.My_Exception;

public class New_Object_Exception
{
	public static void main(String[] args)
	{
		for (int i = 0; i < 10000; i++)
			new Throwable();
		long number = 100000l;
		long current1 = System.currentTimeMillis();
		for (long j = 0l; j < number; j++)
			new My_Exception();
		long current2 = System.currentTimeMillis();
		for (long i = 0l; i < number; i++)
			new Exception();
		long current3 = System.currentTimeMillis();
		System.out.println("new My_Exception time : " + (current2 - current1) + " ms");
		System.out.println("new Exception time : " + (current3 - current2) + " ms");

	}
}

 console输出:

new My_Exception time : 113 ms
new Exception time : 144 ms

 相差很小,一个数量级,无视GC了

 

下面测一下抛出异常到接收到异常的时间,代码如下:

 

package exception;

import exception.entity.My_Exception;

public class Catch_Exception
{
	public static void main(String[] args)
	{
		long time = 100000l;
		for (int i = 0; i < 10000; i++)
		{
			new Throwable();
		}

		long current1 = System.currentTimeMillis();
		for (long i = 0l; i < time; i++)
		{
			try
			{
				throw new Exception();
			} catch (Exception e)
			{
			}
		}
		long current2 = System.currentTimeMillis();
		for (long i = 0l; i < time; i++)
		{
			try
			{
				throw new My_Exception();
			} catch (My_Exception e)
			{
			}
		}
		long current3 = System.currentTimeMillis();
		System.out.println("catch Exception : " + (current2 - current1) + " ms");
		System.out.println("catch My_Exception : " + (current3 - current2) + " ms");
	}
}

 console输出:

 

catch Exception : 77 ms
catch My_Exception : 64 ms

 

 

贴一下jdk中Throwable 类的getMessage(), getStackTrace()源码

 

getMessage():

    public String getMessage() {
        return detailMessage;
    }

 detailMessage只是Throwable类的一个私有变量

 private String detailMessage;

 

getStackTrace():

    public StackTraceElement[] getStackTrace() {
        return getOurStackTrace().clone();
    }

 getOurStackTrace():

    private synchronized StackTraceElement[] getOurStackTrace() {
        // Initialize stack trace field with information from
        // backtrace if this is the first call to this method
        if (stackTrace == UNASSIGNED_STACK ||
            (stackTrace == null && backtrace != null) /* Out of protocol state */) {
            int depth = getStackTraceDepth();
            stackTrace = new StackTraceElement[depth];
            for (int i=0; i < depth; i++)
                stackTrace[i] = getStackTraceElement(i);
        } else if (stackTrace == null) {
            return UNASSIGNED_STACK;
        }
        return stackTrace;
    }

 如果不是自定义的异常对象,大概没必要去调这个方法,如果不调这个方法抛出异常,捕获异常,貌似对性能也没什么影响

 

关于异常,各有各的想法吧

 

另外我的电脑配置:i5 win7 64位 4G内存, jdk : jdk1.7.0_10 b18 64位

分享到:
评论

相关推荐

    java解决nested exception is java.lang.OutOfMemoryError Java heap space

    Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang.OutOfMemoryError: Java heap space"是一个常见的问题,通常发生在程序试图分配超过堆内存限制的空间时。这个错误表明Java虚拟机(JVM...

    Java Exception 几种不适当的处理

    ### Java Exception 几种不适当的处理 在Java编程中,异常处理是确保代码健壮性和稳定性的关键环节。然而,在实际开发过程中,由于对异常处理的理解不足或是编码习惯的不当,常常会出现一些不适当的异常处理方式,...

    解决Java_heap_space问题

    ### 解决Java_heap_space问题:深入理解与策略 在Java应用程序开发与运行过程中,经常会遇到一个常见的内存管理问题——“Java heap space”。这个问题通常表现为Java虚拟机(JVM)在执行过程中因可用堆内存不足而...

    java提高性能.pdf

    但是,不恰当的异常处理可能会导致性能问题。文档中的“ExceptionJVMExceptiontry-catchthrow”暗示着这一部分的讨论。 10. 集合操作:在Java中,集合的操作,如数组拷贝(System.arraycopy())以及Apache Commons ...

    java 常见Exception异常解决方法.docx

    Java 编程中常见的十种异常类型——包括 NullPointerException, ArrayIndexOutOfBoundsException, NumberFormatException, IOException, ClassNotFoundException, FileNotFoundException, SQLException, ...

    exception 需要解决的问题

    本篇文章将探讨"exception 需要解决的问题",并结合提供的标签"源码"和"工具"进行深入分析。 在Java编程语言中,异常处理机制通过try-catch-finally语句块实现。当一个异常在try块中发生时,控制权会立即传递给相应...

    java经典问题.rar

    1. **异常处理**:Java异常处理是编程中必不可少的部分,涉及try-catch-finally语句块,异常类层次结构(如Exception和Error),以及如何正确抛出和捕获异常。 2. **多线程**:Java提供了丰富的API来支持多线程编程...

    Java项目开发常见问题分析

    在Java项目开发过程中,开发者经常会遇到一系列的问题,这些问题可能涉及到编程语法、运行环境、框架应用、性能优化等多个方面。以下是一些Java项目开发中的常见问题及其解决方案,旨在帮助开发者提高工作效率,减少...

    java编写的OPCclient

    在实际应用中,OPC客户端可能会与其他系统集成,例如SCADA(Supervisory Control and Data Acquisition)系统或者MES(Manufacturing Execution System),这时需要处理异步数据更新、错误恢复和性能优化等问题。...

    java问题解决途径

    Java中的异常分为两类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。 - **实践案例**:在编写网络编程或文件操作相关的代码时,经常需要处理IOException等受检异常。你可以在方法签名中声明...

    记录java.lang.OutOfMemoryErrorJava heap space的情况.docx

    Java虚拟机(JVM)是Java应用程序的运行环境,它负责执行字节码并管理内存...通过上述方法,可以有效地预防和解决`java.lang.OutOfMemoryError: Java heap space`问题,优化JVM内存管理,提升应用程序的稳定性和性能。

    java开发常遇问题和解决

    在Java开发过程中,开发者经常会遇到各种各样的问题,这些问题涵盖了语法错误、运行时异常、性能优化、并发编程、内存管理等多个方面。以下是一些常见的Java开发问题及其解决方案: 1. **内存溢出(Out of Memory)...

    金蝶接口对接java工具类.zip

    5. **性能优化**:考虑使用缓存策略,减少不必要的请求;如果接口调用频繁,可能需要考虑异步调用或者批量处理,以提高效率。 6. **日志记录**:为了便于后期的问题排查,应记录每次接口调用的详细信息,包括请求...

    brpc-java是baidurpc的java版本实现

    5. **统计与监控**:内置了全面的统计和监控机制,包括调用次数、耗时、错误率等关键指标,便于进行问题定位和性能优化。 6. **线程安全**:设计上充分考虑了多线程环境下的安全性,确保了在并发场景下的正确性和...

    java中Json工具的用法与性能测试

    在Java开发中,JSON(JavaScript ...以上就是关于Java中Fastjson、Jackson、Gson和json-lib这四个JSON工具的用法及性能测试的基本介绍。理解它们的特性可以帮助开发者更有效地处理JSON数据,提高项目的效率和质量。

    通过Java代码技巧改善性能

    通过Java代码技巧改善性能 在本篇文章中,我们将分享一些Java代码技巧,以提高程序性能。这些技巧虽然看起来微不足道,但是可以为系统性能带来成倍的提升。 首先,让我们来讨论try-catch语句的使用。在Java开发中...

    DELPHI 11调用JAVA 接口

    跨语言调用涉及到安全性问题,确保传递的数据是安全的,避免注入攻击。同时,对于敏感操作,应确保Java和Delphi之间的权限控制。 10. **示例代码** 在Delphi 11中,可以这样编写调用Java接口的代码: ```delphi ...

    Java常见问题集锦 _Java常见问题集锦_

    理解如何合理分配和释放内存是避免性能问题的关键。 3. **类与对象**: - **封装**:Java通过访问修饰符(public, private, protected)实现数据封装,防止非法访问。 - **继承**:Java支持单继承,一个类可以...

    纯Java的高性能长连接RPC解决方案.docx

    本文介绍了一个基于Java的高性能长连接RPC解决方案,旨在解决大型电子商务公司系统的承载能力和灵活性问题。该解决方案是基于Netty实现的RPC框架,提供了易于使用和高度可扩展能力的特点。 首先,HSF框架是一个高...

    完美解决java读取excel内存溢出问题.rar

    然而,这并不是长久之计,因为增加内存可能会导致其他问题,如垃圾收集性能下降。 4. **减少对象创建**:在处理Excel数据时,避免创建过多的对象。重复使用对象或者使用高效的数据结构,如ArrayList而非LinkedList...

Global site tag (gtag.js) - Google Analytics