热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

论trycatch是否影响性能

在实际项目中,io,数据库,网络等等,不可避免会发生未知异常,trycatch可以有效的避免页面崩溃,网上有人说一个页四五个trycatch影响效率,这里给出验证:实例:100

在实际项目中,io,数据库,网络等等,不可避免会发生未知异常,try catch 可以有效的避免页面崩溃,网上有人说一个页四五个try catch影响效率,这里给出验证:

实例:100个线程,分别循环100次作为实验单位:

package com.example;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;

/**
 * @author xuanyouwu
 * @email xuanyouwu@163.com
 * @time 2016-05-06 09:27
 */
public class TryCatchStudy {
    static AtomicLong takeTime;
    static AtomicLong takeTime1;

    public static void main(String[] args) throws Exception {
        ExecutorService executorService = Executors.newCachedThreadPool();
        takeTime = new AtomicLong(0);
        takeTime1 = new AtomicLong(0);
        for (int j = 0; j <100; j++) {
            int times = j;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    long startTime = System.currentTimeMillis();
                    for (int i = 0; i <100; i++) {
                        try {
                            execute();
                        } catch (Exception e) {
                        }
                       /* try {
                            Thread.sleep(100);
                        } catch (Exception e) {
                        }*/
                    }
                    long endTime = System.currentTimeMillis();
                    takeTime.addAndGet((endTime - startTime));
                    if (times == 99) {
                        System.out.println("------->take time:" + takeTime.get());
                    }
                }
            });
        }


        for (int j = 0; j <100; j++) {
            int times = j;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    long startTime1 = System.currentTimeMillis();
                    for (int i = 0; i <100; i++) {
                        execute();
                    /*    try {
                            Thread.sleep(100);
                        } catch (Exception e) {
                        }*/
                    }
                    long endTime1 = System.currentTimeMillis();
                    takeTime1.addAndGet((endTime1 - startTime1));
                    if (times == 99) {
                        System.out.println("------->take time2:" + takeTime.get());
                    }
                }
            });
        }
    }

    public static void execute() {
        int res = (((Integer.MAX_VALUE / 2 / 3 - 1) * 2 / 5) - 10 * 100) / 2;
        res--;
        ++res;
        res = res / 2;
    }
}


运行结果:

------->take time:3
------->take time2:3


结果:没有毫秒级别的差距


开启线程睡眠:

package com.example;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;

/**
 * @author xuanyouwu
 * @email xuanyouwu@163.com
 * @time 2016-05-06 09:27
 */
public class TryCatchStudy {
    static AtomicLong takeTime;
    static AtomicLong takeTime1;

    public static void main(String[] args) throws Exception {
        ExecutorService executorService = Executors.newCachedThreadPool();
        takeTime = new AtomicLong(0);
        takeTime1 = new AtomicLong(0);
        for (int j = 0; j <100; j++) {
            int times = j;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    long startTime = System.currentTimeMillis();
                    for (int i = 0; i <100; i++) {
                        try {
                            execute();
                        } catch (Exception e) {
                        }
                        try {
                            Thread.sleep(100);
                        } catch (Exception e) {
                        }
                    }
                    long endTime = System.currentTimeMillis();
                    takeTime.addAndGet((endTime - startTime));
                    if (times == 99) {
                        System.out.println("------->take time:" + takeTime.get());
                    }
                }
            });
        }


        for (int j = 0; j <100; j++) {
            int times = j;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    long startTime1 = System.currentTimeMillis();
                    for (int i = 0; i <100; i++) {
                        execute();
                        try {
                            Thread.sleep(100);
                        } catch (Exception e) {
                        }
                    }
                    long endTime1 = System.currentTimeMillis();
                    takeTime1.addAndGet((endTime1 - startTime1));
                    if (times == 99) {
                        System.out.println("------->take time2:" + takeTime.get());
                    }
                }
            });
        }
    }

    public static void execute() {
        int res = (((Integer.MAX_VALUE / 2 / 3 - 1) * 2 / 5) - 10 * 100) / 2;
        res--;
        ++res;
        res = res / 2;
    }
}


运行结果:

------->take time2:601414
------->take time:631501


循环100万次:


package com.example;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;

/**
 * @author xuanyouwu
 * @email xuanyouwu@163.com
 * @time 2016-05-06 09:27
 */
public class TryCatchStudy {
    static AtomicLong takeTime;
    static AtomicLong takeTime1;

    public static void main(String[] args) throws Exception {
        ExecutorService executorService = Executors.newCachedThreadPool();
        takeTime = new AtomicLong(0);
        takeTime1 = new AtomicLong(0);
        for (int j = 0; j <100; j++) {
            int times = j;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    long startTime = System.currentTimeMillis();
                    for (int i = 0; i <100_0000; i++) {
                        try {
                            execute();
                        } catch (Exception e) {
                        }
                    }
                    long endTime = System.currentTimeMillis();
                    takeTime.addAndGet((endTime - startTime));
                    if (times == 99) {
                        System.out.println("------->take time:" + takeTime.get());
                    }
                }
            });
        }


        for (int j = 0; j <100; j++) {
            int times = j;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    long startTime1 = System.currentTimeMillis();
                    for (int i = 0; i <100_0000; i++) {
                        execute();
                    }
                    long endTime1 = System.currentTimeMillis();
                    takeTime1.addAndGet((endTime1 - startTime1));
                    if (times == 99) {
                        System.out.println("------->take time2:" + takeTime.get());
                    }
                }
            });
        }
    }

    public static void execute() {
        int res = (((Integer.MAX_VALUE / 2 / 3 - 1) * 2 / 5) - 10 * 100) / 2;
        res--;
        ++res;
        res = res / 2;
    }
}

运行结果:

------->take time:48
------->take time2:164


结论 一般应用完全可以忽略try catch带来的效率影响,当百万计的大数据并发,有秒的差距,app可以忽略,后台要适当考虑



论 try catch是否影响性能


推荐阅读
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • 在 Android 开发中,`android:exported` 属性用于控制组件(如 Activity、Service、BroadcastReceiver 和 ContentProvider)是否可以被其他应用组件访问或与其交互。若将此属性设为 `true`,则允许外部应用调用或与之交互;反之,若设为 `false`,则仅限于同一应用内的组件进行访问。这一属性对于确保应用的安全性和隐私保护至关重要。 ... [详细]
  • 在最近的项目中,我们广泛使用了Qt框架的网络库,过程中遇到了一些挑战和问题。本文旨在记录这些经验和解决方案,以便日后参考。鉴于我们的客户端GUI完全基于Qt开发,我们期望利用其强大的网络功能进行Fiddler网络数据包的捕获与分析,以提升开发效率和应用性能。 ... [详细]
  • Unity3D 中 AsyncOperation 实现异步场景加载及进度显示优化技巧
    在Unity3D中,通过使用`AsyncOperation`可以实现高效的异步场景加载,并结合进度条显示来提升用户体验。本文详细介绍了如何利用`AsyncOperation`进行异步加载,并提供了优化技巧,包括进度条的动态更新和加载过程中的性能优化方法。此外,还探讨了如何处理加载过程中可能出现的异常情况,确保加载过程的稳定性和可靠性。 ... [详细]
  • 在Conda环境中高效配置并安装PyTorch和TensorFlow GPU版的方法如下:首先,创建一个新的Conda环境以避免与基础环境发生冲突,例如使用 `conda create -n pytorch_gpu python=3.7` 命令。接着,激活该环境,确保所有依赖项都正确安装。此外,建议在安装过程中指定CUDA版本,以确保与GPU兼容性。通过这些步骤,可以确保PyTorch和TensorFlow GPU版的顺利安装和运行。 ... [详细]
  • 在Eclipse中提升开发效率,推荐使用Google V8插件以增强Node.js的调试体验。安装方法有两种:一是通过Eclipse Marketplace搜索并安装;二是通过“Help”菜单中的“Install New Software”,在名称栏输入“googleV8”。此插件能够显著改善调试过程中的性能和响应速度,提高开发者的生产力。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • Nginx 反向代理配置与应用指南
    本文详细介绍了 Nginx 反向代理的配置与应用方法。首先,用户可以从官方下载页面(http://nginx.org/en/download.html)获取最新稳定版 Nginx,推荐使用 1.14.2 版本。下载并解压后,通过双击 `nginx.exe` 文件启动 Nginx 服务。文章进一步探讨了反向代理的基本原理及其在实际应用场景中的配置技巧,包括负载均衡、缓存管理和安全设置等,为用户提供了一套全面的实践指南。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 该问题可能由守护进程配置不当引起,例如未识别的JVM选项或内存分配不足。建议检查并调整JVM参数,确保为对象堆预留足够的内存空间(至少1572864KB)。此外,还可以优化应用程序的内存使用,减少不必要的内存消耗。 ... [详细]
  • 在 Mac 上查看隐藏文件和文件夹的详细指南。通过终端命令,您可以轻松地显示或隐藏这些文件。具体步骤如下:输入 `defaults write com.apple.finder AppleShowAllFiles -bool true` 以显示所有隐藏文件,或使用 `defaults write com.apple.finder AppleShowAllFiles -bool false` 以重新隐藏它们。此方法适用于各种版本的 macOS,帮助用户更好地管理和访问系统文件。 ... [详细]
  • 本文详细解析了逻辑运算符“与”(&&)和“或”(||)在编程中的应用。通过具体示例,如 `[dehua@teacher~]$[$(id -u) -eq 0] && echo "You are root" || echo "You must be root"`,展示了如何利用这些运算符进行条件判断和命令执行。此外,文章还探讨了这些运算符在不同编程语言中的实现和最佳实践,帮助读者更好地理解和运用逻辑运算符。 ... [详细]
  • 二分查找算法详解与应用分析:本文深入探讨了二分查找算法的实现细节及其在实际问题中的应用。通过定义 `binary_search` 函数,详细介绍了算法的逻辑流程,包括初始化上下界、循环条件以及中间值的计算方法。此外,还讨论了该算法的时间复杂度和空间复杂度,并提供了多个应用场景示例,帮助读者更好地理解和掌握这一高效查找技术。 ... [详细]
  • 蚂蚁课堂:性能测试工具深度解析——JMeter应用与实践
    蚂蚁课堂:性能测试工具深度解析——JMeter应用与实践 ... [详细]
  • 在 iOS 开发中,经常会遇到 `@(YES)`、`@[firstViewController]` 以及 `@{@a:@b}` 这样的语法糖。这些简化的写法分别用于初始化布尔值、数组和字典对象,能够显著提高代码的可读性和编写效率。例如,`@(YES)` 可以快速创建一个布尔值对象,`@[firstViewController]` 则用于创建包含单个元素的数组,而 `@{@a:@b}` 则用于创建键值对字典。理解这些语法糖的使用方法,有助于开发者更加高效地进行编码。 ... [详细]
author-avatar
023597
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有