Java 代码优化:关于 说“try catch 放在 for/while 循环之外,会提高效率 优化代码”的测试

在有的文章中,关于Java代码优化有这么一条:

【【不要在循环中使用 try-catch,应该把其放在最外层。】】

我是怀疑的,然后,今天就来实际测试一下。看看是不是真的像这条建议所言,真的有优化效果。不能以讹传讹,假的都成真的啦

使用JProfiler来测试一下,OK,let's go。开始测试;

第一次测试:

package com.lxk.fast;

import com.lxk.model.Dog;

/**
 * 据说 try catch 在for循环体中会影响效率,不服来测测。
 *
 * @author LiXuekai on 2019/7/19
 */
public class TryCatchIsFastInOrOutFor {
    private static final int FOR_MAX = 1000;
    private static final int FOR_MAX_ = 999;

    public static void main(String[] args) {
        test();
    }

    private static void test() {
        while (true) {
            //testNoException();
            testException();
        }
    }

    /**
     * 在 try catch 中【会】抛异常
     */
    private static void testException() {
        out();
        in();
    }

    /**
     * 在try catch 中【不会】抛异常
     */
    private static void testNoException() {
        inNoException();
        outNoException();
    }

    private static void in() {
        int i = 0;
        while (i < FOR_MAX) {
            try {
                Dog dog = new Dog();
                //确保最后一次抛异常,大家循环次数一致
                if (i == FOR_MAX_) {
                    throw new Exception("xxxxxxxxx");
                }
            } catch (Exception e) {
            }
            i++;
        }
    }

    private static void out() {
        int i = 0;
        try {
            while (i < FOR_MAX) {
                Dog dog = new Dog();
                //确保最后一次抛异常,大家循环次数一致 不能上来就抛异常,那么这个循环次数就比上面少了。
                if (i == FOR_MAX_) {
                    throw new Exception("xxxxxxxxx");
                }
                i++;
            }
        } catch (Exception e) {
        }

    }

    private static void outNoException() {
        int i = 0;
        try {
            while (i < FOR_MAX) {
                Dog dog = new Dog();
                if (i == FOR_MAX_) {
                    new Exception("xxxxxxxxx");
                }
                i++;
            }
        } catch (Exception e) {
        }
    }

    private static void inNoException() {
        int i = 0;
        while (i < FOR_MAX) {
            try {
                Dog dog = new Dog();
                if (i == FOR_MAX_) {
                    new Exception("xxxxxxxxx");
                }
            } catch (Exception e) {
            }
            i++;
        }
    }
}

测试效果如下:

大师兄

代码解释一下:

2个方法的执行次数,咱先保证一致,在最后一次的时候,抛异常,使得测试环境一致,结果才不会太尴尬。

上面测试的是代码在循环的时候真的抛异常啦,在抛异常的情况下,看看效率比。

结果:

发现,结果是差不多的嘛,五五开嘛,差距0.3%,太小了,忽略吧。

 

第二次测试:

使用第一个方法,走不抛异常的情况下,看看这个try catch 在里面和在外边 有没有太大的差别。

大师兄

结果:

结果对比,差距0.9%,在循环里面的时候,这个Dog在构造对象的时候,多花了0.4%。这是为啥呢?

 

总的来说:

这2个的差距,并没有可观的性能提升,,,,,SO,

【【不要在循环中使用 try-catch,应该把其放在最外层。】】

这个理论,是扯犊子的嘛,都以讹传讹的,说这个姿势可以优化代码,然后就这么写了,都不带实际测试的,别人说啥就是啥。

还有就是,在这个循环过程中,你要是try catch 写在外边,那么循环里面一旦异常,这个循环就gg了,估计这不是你的意图吧,我既然循环,那肯定是有的是可以成功的,不是说一个异常了,就全完蛋了。不能这么干吧。

所以,再次说明,当初总结这个理论的人,完全是扯犊子的。写在外边,是影响正常代码逻辑的。不OK的。

我反对?‍♂️。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1篇 Java编程基础   第1章 Java开发环境的搭建(教学视频:9分钟) 2   1.1 理解Java 2   1.2 搭建Java所需环境 3   1.2.1 下载JDK 3   1.2.2 安装JDK 4   1.2.3 配置环境 5   1.2.4 测试JDK配置是否成功 7   实例1 开发第一个Java程序 7   第2章 Java基础类型与运算符(教学视频:39分钟) 9   2.1 基础类型 9   实例2 自动提升 9   实例3 自动转换 10   实例4 常用基础类型之强制转换 11   2.2 运算符 12   实例5 算术运算符 12   实例6 关系运算符 13   实例7 逻辑运算符 14   实例8 位运算符 15   实例9 移位运算符 16   实例10 转型运算符 17   2.3 其他形式 18   实例11 常量与变量 18   实例12 各种进制的转换 19   实例13 Java中的进制与移位运算符 22   第3章 条件控制语句(教学视频:75分钟) 26   3.1 if控制语句 26   实例14 判断输入的年份是否为闰年 26   实例15 抽奖活动 27   3.2 for语句 28   实例16 小九九乘法表 28   实例17 如何列出素数 29   实例18 Java中的递归 31   实例19 男生女生各多少人 32   实例20 求水仙花数 34   实例21 求任意一个正数的阶乘 35   实例22 求n的n次方 35   实例23 利用for循环输出几何图形 36   实例24 杨辉三角 38   3.3 while语句 39   实例25 求1到100之间的和 39   实例26 存上100元需要多少天 40   实例27 输出100之间的所有偶数 41   实例28 如何判断回文数字 42   3.4 do…while语句 43   实例29 输出100之间的所有奇数 44   实例30 求最大的随机数 44   3.5 switch语句 45   实例31 判断字母分类 46   实例32 优良及差 47   实例33 打印任意一年日历 48   实例34 一年四季的划分 51   第2篇 Java数据处理   第4章 异常处理(教学视频:62分钟) 54   4.1 编译时异常 54   实例35 除0发生的算术异常(ArithmeticException) 54   实例36 数组下标越界异常(ArrayIndexOutOfBoundsException) 55   实例37 数组元素类型不匹配异常(ArrayStoreException) 56   实例38 强制类型转换异常(ClassCastException) 56   实例39 索引越界异常(IndexOutOfBoundsException) 57   实例40 空指针异常(NullPointerException) 58   实例41 数字格式转换异常(NumberFornatException) 59   实例42 字符串索引越界异常(StringIndexOutBounds) 60   实例43 操作错误(UnsupportedOperationException) 60   4.2 运行时异常 61   实例44 找不到指定类时发生的异常(ClassNotFoundException) 62   实例45 请求的方法不存在(NoSuchMethodException) 63   4.3 trycatch捕获异常 65   实例46 trycatch捕获异常的实例 66   实例47 trycatch…finally捕获异常的实例 67   实例48 trycatch嵌套捕获异常的实例 68   4.4 throws声明异常 69   实例49 throws声明异常实例一 69   实例50 throws声明异常实例二 70   4.5 throw抛出异常 72   实例51 throw抛出异常实例一 72   实例52 throw抛出异常实例二 73   4.6 自定义异常 74   实例53 自定义异常实例一 74   实例54 自定义异常实例二 75   第5章 数组(教学视频:98分钟) 78   5.1 一维数组 78   实例55 一
如果需要下载一百个文件,循环下载可能比较慢,可以考虑使用多线程或者异步方式优化下载速度。 以下是使用多线程的示例代码: ```java import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; public class DownloadFiles { public static void main(String[] args) { List<String> urls = new ArrayList<>(); // 存储文件下载链接 // 添加100个文件下载链接,此处省略 int threads = 10; // 设置线程数 int perThread = urls.size() / threads; // 每个线程下载的文件数量 for (int i = 0; i < threads; i++) { int start = i * perThread; int end = (i == threads - 1) ? urls.size() : (i + 1) * perThread; List<String> subUrls = urls.subList(start, end); new DownloadThread(subUrls).start(); // 启动线程进行下载 } } static class DownloadThread extends Thread { private List<String> urls; public DownloadThread(List<String> urls) { this.urls = urls; } @Override public void run() { for (String url : urls) { try { URLConnection conn = new URL(url).openConnection(); InputStream in = conn.getInputStream(); OutputStream out = null; // 此处省略输出流的创建 byte[] buffer = new byte[1024]; int len; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } in.close(); out.close(); } catch (Exception e) { e.printStackTrace(); } } } } } ``` 以上代码将100个文件下载链接分成10组,每组启动一个线程进行下载,可以大大提高下载速度。 如果使用异步方式,可以使用Java 8中的CompletableFuture类,示例代码如下: ```java import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; public class DownloadFiles { public static void main(String[] args) { List<String> urls = new ArrayList<>(); // 存储文件下载链接 // 添加100个文件下载链接,此处省略 List<CompletableFuture<Void>> futures = new ArrayList<>(); for (String url : urls) { CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { try { URLConnection conn = new URL(url).openConnection(); InputStream in = conn.getInputStream(); OutputStream out = null; // 此处省略输出流的创建 byte[] buffer = new byte[1024]; int len; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } in.close(); out.close(); } catch (Exception e) { e.printStackTrace(); } }); futures.add(future); } CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); } } ``` 以上代码使用CompletableFuture类创建异步任务进行下载,也可以提高下载速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值