`
徐风子
  • 浏览: 37501 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

throw Exception 的执行效率试验

阅读更多

为了说服当前维护的项目改用 Exception 处理错误,要弄一个异常效率的数据出来。唉…………

  • 测试代码

 

        /**
         * 异常效率测试
         * @throws Exception
         */
        @Test
        public void testThrowEfficiency() throws Exception {
                long times = 1000000;
                long startTime;
                System.out.println(times + "循环测试");

                try {
                        recursion(0, true);
                }
                catch (Exception e) {
                        System.out.println("异常堆栈深度:" + e.getStackTrace().length);
                }

                for(int count = 0; count < 10; count++) {
                        startTime = System.currentTimeMillis();
                        for (int i = 0; i < times; i++) {
                                try {
                                        recursion(0, true);
                                }
                                catch (Exception e) {
                                }
                        }
                        System.out.println("有异常存在:" + (System.currentTimeMillis() - startTime));
                        
                        startTime = System.currentTimeMillis();
                        for (int i = 0; i < times; i++) {
                                try {
                                        recursion(0, false);
                                }
                                catch (Exception e) {
                                }
                        }
                        System.out.println("无:" + (System.currentTimeMillis() - startTime));
                }
        }
        
        private void recursion(int count, boolean isThrow) {
                if(count == 10) {
                        if(isThrow) {
                                throw new IllegalStateException("");
                        }
                        return;
                }
                recursion(count+1, isThrow);
        }
        
        public static void main(String[] args) throws Exception {
                Test test = new MakeKeyNoTest();
                test.testThrowEfficiency();
        }

 

  • 测试机器:

cpu:赛扬 CeleronM CPU 520  @ 1.60GHz(我可怜的机器……)

内存:2GB

  • 测试结果:(时间:毫秒)

 

BODY { FONT-FAMILY:Tahoma; FONT-SIZE:10pt } P { FONT-FAMILY:Tahoma; FONT-SIZE:10pt } DIV { FONT-FAMILY:Tahoma; FONT-SIZE:10pt } TD { FONT-FAMILY:Tahoma; FONT-SIZE:10pt }

1000000循环测试
异常堆栈深度:13
有异常存在:2766
无:47
有异常存在:2890
无:47
有异常存在:2719
无:47
有异常存在:2718
无:47
有异常存在:2688
无:47
有异常存在:2718
无:47
有异常存在:2703
无:32
有异常存在:2672
无:63
有异常存在:2703
无:47
有异常存在:2703
无:31
1000000循环测试
异常堆栈深度:23
有异常存在:3688
无:94
有异常存在:3593
无:94
有异常存在:3625
无:94
有异常存在:3625
无:78
有异常存在:3922
无:94
有异常存在:5625
无:437
有异常存在:8469
无:94
有异常存在:4390
无:94
有异常存在:3594
无:109
有异常存在:3610
无:93
1000000循环测试
异常堆栈深度:33
有异常存在:5328
无:141
有异常存在:5109
无:125
有异常存在:5109
无:157
有异常存在:5093
无:141
有异常存在:12563
无:125
有异常存在:5125
无:125
有异常存在:5218
无:125
有异常存在:5172
无:141
有异常存在:5125
无:140
有异常存在:5204
无:125
1000000循环测试
异常堆栈深度:53
有异常存在:6172
无:234
有异常存在:6063
无:219
有异常存在:6031
无:234
有异常存在:6094
无:234
有异常存在:6078
无:219
有异常存在:6047
无:219
有异常存在:6062
无:235
有异常存在:6031
无:250
有异常存在:6156
无:235
有异常存在:6062
无:234

 


结果分析:
  1. 堆栈深度对速度影响很大,基本上呈线性增长。
  2. 在13层堆栈深度的情况下 耗时约2.7秒,折算每次异常用时 2.7微妙,及普通机器每秒可运行异常抛出37万次。

异常的效率比我以前想象的还要高。

 

 

 
 

 

分享到:
评论

相关推荐

    Java throw Exception实现异常转换

    在上面的代码中,我们定义了一个throwException方法,接收一个Exception参数,并将其转换为unchecked exception。 五、RethrowUsage的实现 RethrowUsage是使用RethrowException实现异常转换的示例代码。下面是一个...

    C# throw詳解

    throw new Exception("异常消息"); ``` 这里创建了一个新的`Exception`实例,并传递了一个字符串作为异常消息。当执行到这条语句时,程序将停止执行当前方法的剩余部分,并将控制权交给异常处理程序。 #### 三、...

    java throw抛出异常实例二

    在实例二中,我们可能看到一个`ThrowException_02.java`的源代码文件,它展示了如何使用`throw`语句。一个典型的示例可能是这样的: ```java public class ThrowException_02 { public static void main(String[] ...

    throws与throw的区别

    `,這裡的throw语句抛出了一个Exception3异常。 throws和throw的區別 throws和throw的主要區別在于: 1. 使用场景:throws用于方法声明中,表示该方法可能會抛出某种类型的异常;throw用于方法体内,表示抛出一个...

    Java的throw和return

    当程序中检测到某个条件不符合预期时(例如输入数据非法或资源不可用),可以通过`throw`手动引发异常,从而中断正常的执行流程并转移到异常处理机制。下面通过一个简单的示例来展示如何使用`throw`: ```java ...

    exception C++ & More exception C++

    当程序中发生错误或者不正常情况时,可以通过抛出(throw)一个异常来中断正常的执行流程,然后在适当的地方捕获(catch)这个异常并进行适当的处理。 1. **异常定义**:在C++中,异常是一个可以被抛出的对象,通常...

    java throw抛出异常实例一

    在`ThrowException_01.java`文件中,可能包含了如下的实例代码: ```java public class ThrowException_01 { public static void main(String[] args) { try { // 检查某种条件,如果不符合就抛出自定义异常 if...

    exception 异常处理 exception

    4. **finally 块**:无论是否发生异常,`finally` 块中的代码都会被执行,常用来释放资源。 #### 五、最佳实践 - **合理使用异常**:只在确实需要时才抛出异常,避免过度使用。 - **异常消息明确**:在创建异常...

    C++异常处理技巧try/catch/throw/finally/exception

    通过合理地使用`try`、`catch`、`throw`和`exception`等关键字,开发者不仅能够编写更加可靠的代码,还能显著提升程序的可维护性和可读性。 #### 二、C++标准异常处理 ##### 1. 构造和析构中的异常抛出 在C++中,...

    throws与throw区别

    - `throw`关键字用于在代码执行过程中显式地抛出异常,通常用于响应特定的程序状态或错误条件。 - 正确使用`throws`和`throw`可以帮助开发者更好地控制异常流,增强程序的健壯性和可维护性。 理解这两个关键字的...

    java Exception

    无论是否发生异常,`finally`块中的代码总会被执行,这使得`finally`块非常适合用来执行清理工作,如关闭文件流、数据库连接等。 ```java try { // 可能抛出异常的代码 } catch (Exception e) { // 处理异常 } ...

    JAVA 自定义异常 Exception

    这就是“JAVA 自定义异常 Exception”所涉及的内容。 自定义异常是在Java中通过继承`java.lang.Throwable`或其子类(如`Exception`或`Error`)来实现的。通常,我们选择继承`Exception`类,因为它用于表示程序可以...

    Exception C++ 和 More Exception C++

    当程序抛出一个异常(`throw`),执行流会立即跳出当前作用域,寻找最近的`catch`块来处理这个异常。 2. `try`块: `try`块是包含可能引发异常的代码的部分。如果在`try`块内的代码抛出异常,控制权将立即传递到与...

    C++_Exception handling

    异常处理将错误处理代码从程序的主要执行流程中分离出来,使得主要逻辑不受错误处理的干扰,从而提高程序的可读性和可维护性。 13.2 异常处理何时应该使用 异常处理通常用于处理那些可能导致程序崩溃或严重错误的...

    Nutz-1.b.38

    同传统的 SSH 相比,它具备如下特点:轻 -- 当前最新版,整个 jar 文件共 910kB -- 针对 JDBC 的薄封装,无缓存全 -- 提供了 Dao (ORM, SQL 管理), Ioc, Aop, Mvc, Json解析 等必要功能活 -- 各个部分可以独立使用,...

    C++Exception 异常处理 源码

    异常处理通常涉及三个关键字:`try`、`catch`和`throw`,它们协同工作以确保程序在遇到问题时能够优雅地恢复或提供有用的错误信息。 1. **异常基础**: C++中的异常是一种结构化错误处理方式,它允许程序在运行时...

    WEB开发 之 JavaScript 错误 - Throw、Try 和 Catch.docx

    正确的技术术语是:创建或抛出异常(exception)。如果把Throw与Try和Catch一起使用,那么您能够控制程序流,并生成自定义的错误消息。 在实际开发中,我们可以使用Try、Catch和Throw语句来处理错误。例如,在一个...

    throw关键字

    Java中的throw与throws的关键字的使用

    Java exception_java_

    throw new MyCustomException("A custom exception occurred."); ``` 这样,当特定条件满足时,可以抛出自定义异常,提供更具体的错误信息。 总之,Java异常处理是通过异常类型、声明异常、抛出异常、捕获异常和...

    c++异常处理exception.rar

    在C++中,异常处理是通过`try`、`catch`和`throw`这三个关键字来实现的。下面将详细阐述这些概念以及相关的知识点。 1. 异常和异常类: C++中的异常是一个对象,它表示程序运行过程中出现的非正常状态。当一个异常...

Global site tag (gtag.js) - Google Analytics