论 try catch是否影响性能

在实际项目中,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 [email protected]
 * @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 [email protected]
 * @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 [email protected]
 * @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可以忽略,后台要适当考虑

时间: 2024-10-18 21:08:58

论 try catch是否影响性能的相关文章

为什么SQL语句Where 1=1 and在SQL Server中不影响性能

    最近一个朋友和我探讨关于Where 1=1 and这种形式的语句会不会影响性能.最后结论是不影响.     虽然结论正确,但对问题的认识却远远没有解决问题的根本.实际上在T-SQL语句的书写过程中经常犯得错误就是得出一个很窄的结论,然后教条式的奉若圣经,对于T-SQL领域来说,在网上经常可以看到所谓的优化守则,随便在网上搜了一些摘录如下: 不要有超过5个以上的表连接(JOIN) 考虑使用临时表或表变量存放中间结果 少用子查询 视图嵌套不要过深,一般视图嵌套不要超过2个为宜. 对出现在wh

理解 OpenStack Swift (3):监控和一些影响性能的因素 [Monitoring and Performance]

本系列文章着重学习和研究OpenStack Swift,包括环境搭建.原理.架构.监控和性能等. (1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 (2)原理.架构和性能 (3)监控 对 Swift 集群的监控是必要的,特别是集群规模很大的时候. 1. 监控目标 主要的监控目标包括: 硬件故障 操作系统故障 Swift 集群健康状态 Swift 集群状态 2. Swift 提供的工具 2.1 Swift 自带的各种 Audit 工具 2.1.1

在j2ee开发中影响性能的原因以及相关处理性的建议

java是现在比较流行的软件开发语言,同时也是互联网应用中安全性相对较高的一种开发语言了.被很多的电子金融系统开发企业以及电子商务网站建设企业所看重.虽然说在如今的互联网开发中,它比较有优势,然而用得不当的话,反而会使电子商务网站建设的性能受到影响.电子商务网站建设企业,就从多年的java商城开发中说说影响java商城系统和jsp商城效率的原因.    1.缺乏正确的容量规划    容量规划是一个全面的和发展的过程标准,预测当前和未来的IT环境容量需求.制定合理的容量规划不仅会确保和跟踪当前IT

MySQL影响性能的因素原因以及性能优化配置详解

(https://blog.csdn.net/kangshuo2471781030/article/details/79315577) 一.MySQL性能优化之-影响性能的因素 1.商业需求的影响 不合理需求造成资源投入产出比过低,这里我们就用一个看上去很简单的功能来分析一下. 需求:一个论坛帖子总量的统计,附加要求:实时更新 从功能上来看非常容易实现,执行一条SELECT COUNT(*) from 表名的Query 就可以得到结果.但是,如果我们采用不是MyISAM 存储引擎,而是使用的In

XAF-由于try catch导致的性能问题一例

前几天在制作PMMS系统时,有天突然发现性能问题下降严重,发布到客户机后,每点击一个按钮要花5-10秒的时间,与本机的200-600毫秒差距很大. 经过多处优化后没有效果. 后来想起,最近增加的功能是"日志"功能,即,在每次点击按钮后,取得客户端的IP,机器名,并记录访问了哪些界面. 在取得机器名时,asp.net取得有几种方法,但是在不同环境下效果是不同的,asp.net客户端的权限是很小的,比如在局域网中,信任程度高一些,能取得到,而到了互联网中,却不能取到,由于在调试过程中将取机

SQL中使用or影响性能的解决办法

近期做了一个存储过程,执行时发现非常的慢,竟然需要6.7秒! 经排查,发现时间主要都耗在了其中一段查询语句上.这个语句用于查出结构相同的两个表中,其中两个字段的任一个字段数据相同的记录. 例如,A表的结构如下所示: --会员表 CREATE Table Member ( MemberID int, --会员ID MemberName varchar(50), --会员姓名 MemberPhone varchar(50) --会员电话 ) go B表的结构与A表完全相同,假设表名为Member_T

C# 程序性能提升篇-2、类型(字段类型、class和struct)的错误定义所影响性能浅析

前景提要: 编写程序时,也许你不经意间,就不知不觉的定义了错误的类型,从而发生了额外的性能消耗,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候,减少了不必要额外的消耗,使优化程序提高效率的一种途径.不仅跬步,无以至千里,不积小流,无以至江河.优化从点点滴滴做起. 一.问题抛出: 大家先看这么一段定义 class ReserveData  { public string ReserveId;   public string patient_

mysql 证明为什么用limit时,offset很大会影响性能

本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/117 首先说明一下MySQL的版本: mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.17 | +-----------+ 1 row in set (0.00 sec) 表结构: mysql> desc test; +--------+-------------

影响性能的可能性

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545; min-height: 14.0px } p.p3 { margin: 0.0px 0.0px 2.0px 0.0px; f