有关C#中使用if else和try catch的问题及效率问题

本来if esle 是流程控制 try catch是异常处理,本身其实是没有可比性的,但是开发过程中有的人很容易混用,而且两者有的时候效果似乎一样,所以我还是用了个简单的测试来简单的比较下。

不多说,直接上代码:页面test.aspx.cs的代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using xiejun.Common;

namespace xiejun.test
{
    public partial class test : System.Web.UI.Page
    {
        protected string A = "";//比较try catch 和if else 效率问题
        protected string sTimeStart = "";
        protected string sTimeEnd = "";
        protected void Page_Load(object sender, EventArgs e)
        {
            IfElse();
            TryCatch();
        }

        /// <summary>
        /// if else 方法
        /// </summary>
        private void IfElse() {
            int forCount = 300 * 10000;
            sTimeStart = DateTime.Now.ToString();
            for (int i = 0; i < forCount; i++)
            {
                if (!string.IsNullOrEmpty(Request.QueryString["id"]))
                {
                    A = Request.QueryString["id"].ToString();
                }
                else {
                    A = "不存在参数id";
                }
            }
            sTimeEnd = DateTime.Now.ToString();
            CommonMethods.WriteTxt("开始时间:" + sTimeStart + "结束时间:" + sTimeEnd);
        }
        /// <summary>
        /// try catch方法
        /// </summary>
        private void TryCatch() {
            int forCount = 300 * 10000;
            sTimeStart = DateTime.Now.ToString();
            for (int i = 0; i < forCount; i++)
            {
                try
                {
                    A = Request.QueryString["id"].ToString();
                }
                catch {
                    A = "不错在参数id";
                }
            }
            sTimeEnd = DateTime.Now.ToString();
            CommonMethods.WriteTxt("开始时间:" + sTimeStart + "结束时间:" + sTimeEnd);
        }
    }
}

对比

test.aspx?id=1运行结果

开始时间:2015/4/29 17:15:01结束时间:2015/4/29 17:15:02
开始时间:2015/4/29 17:15:02结束时间:2015/4/29 17:15:02

test.aspx运行结果
开始时间:2015/4/29 17:22:50结束时间:2015/4/29 17:22:51
开始时间:2015/4/29 17:22:51结束时间:2015/4/29 17:23:20

可以看到当运行正常的时候 try catch 和if else 运行300万次效率都在一秒之内,而存在异常的时候try catch所用时间是29秒,if else 只用了1秒钟处理,如果在已知存在的异常下 用try catch 效率足足比if else了将近30倍;

总结:

我们在能够预料到一些基本的异常的时候尽量代码处理 异常 如上 用if else ,只有在存在未知异常的时候 用try catch,在已知存在某些异常的情况下用try catch代替if else做流程控制 是非常不好的习惯,循环次数多的话,差异还是非常明显。

时间: 2024-10-08 14:33:32

有关C#中使用if else和try catch的问题及效率问题的相关文章

T-SQL编程中的异常处理-异常捕获(try catch)与抛出异常(throw)

原文:T-SQL编程中的异常处理-异常捕获(try catch)与抛出异常(throw) 本文出处: http://www.cnblogs.com/wy123/p/6743515.html T-SQL编程与应用程序一样,都有异常处理机制,比如异常的捕获与异常的抛出(try catch throw),本文简单介绍异常捕获与异常抛出在T-SQL编程中的实际使用 . 异常处理简单说明 异常捕获在应用程序编程中非常常见,提供了处理程序运行时出现的任何意外或异常情况的方法刚毕业的时候对于异常处理迷茫不解,

WPF中多线程统计拆箱装箱和泛型的执行效率

WPF中多线程统计拆箱装箱和泛型的执行效率,使用的知识点有泛型.多线程.委托,从例子中可以看到使用泛型的效率至少提升2倍 MainWindow.xaml <Window x:Class="Box.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xa

C++用%20替换字符串中的空格(O(n)的时间效率)

#include <iostream> #include <malloc.h> #include <string.h> using namespace std; //将字符串中的空格用%20替换. void Grial(char *str) { if(str==NULL)return ; char *p = str; char *q = NULL; char buf[strlen(str)+1]; int count = 0;//计数空格数. while(*p!='\0

Java牛角尖【007】:Java中的Error能不能被Catch

网上看到很多朋友说Java中Error是无法Catch到的,而Java中定义的Error类型又很难测试到,那就估且以为确是如此吧. 但是或许大家都有注意,我们时常会看到这样的代码 [java] view plain copy try{ ... }catch(Throwable ex){ ... } 其中catch中直接捕捉的是一个Throwable类,打开继承关系看一下,Exception和Error两个类同样是从Throwable类继承而来,那么,也就是说Error应该是可以被捕捉的,下面写个

比较C#中几种常见的复制字节数组方法的效率[转]

[原文链接] 在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadBytes,Buffer.BlockCopy,以及System.Buffer.memcpyimpl,由于最后一种需要使用指针,所以本文不引入该方法. 本次测试,使用以上前4种方法,各运行1000万次,观察结果. using System; using System.Collections.Generic; using

对Promise中的resolve,reject,catch的理解

想必接触过Node的人都知道,Node是以异步(Async)回调著称的,其异步性提高了程序的执行效率,但同时也减少了程序的可读性.如果我们有几个异步操作,并且后一个操作需要前一个操作返回的数据才能执行,这样按照Node的一般执行规律,要实现有序的异步操作,通常是一层加一层嵌套下去. 为了解决这个问题,ES6提出了Promise的实现... 一   Promise 对象的含义? Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示.简单点说,它就是用于处理异步操作的,异步处理成

50-02 字符流中第一个不重复的字符( 时间空间效率的平衡)

题目描述: 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l". 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符.   测试用例: 1)功能测试(读入一个字符,读入多个字符,读入的所有字符都是唯一的,读入的所有字符都是重复出现的) 2)特殊输入测试(读入0个字符时)

lua中,两种json和table互转方法的效率比较

lua中json和table的互转,是我们在平时开发过程中经常用到的.比如: 在用lua编写的服务器中,如果客户端发送json格式的数据,那么在lua处理业务逻辑的时候,必然需要转换成lua自己的数据结构,如table.此时,就会用到table和json格式的互转. 在用lua编写的服务器中,如果我们通过redis来存储数据,由于redis中不存在table这种数据结构,因此,我们可以选择将table转换成json字符串来进行存储.在数据的存取过程中,也会用到table和json格式的互转. 以

6-探秘Java中的String、StringBuilder以及StringBuffer

相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它们的异同点以及了解各个类适用的场景.下面是本文的目录大纲: 一.你了解String类吗? 二.深入理解String.StringBuffer.StringBuilder 三.不同场景下三个类的性能测试 四.常见的关于String.StringBuffer的面试题(辟谣网上流传的一些曲解String类