性能杀手之异常霸气外露!找死!

2年前 (2022) 程序员胖胖胖虎阿
229 0 0

在上篇:周末浅说--未将对象引用设置到对象的实例(System.NullReferenceException) 中,介绍了一个比较经典的异常。

 

文中并浅出一些个人观点,又潜伏一些观点。

 

本节将从上篇的文章中,引申潜伏在上文的另一个主题异常霸气外露!找死!

 

先不说网友以前是怎么认识try catch和异常的处理,这里先给出两个示例代码:

 

1:循环20万次的判断,看时间:

 

        static object a;
        
static void Main(string[] args)
        {
            System.Diagnostics.Stopwatch watch 
= new System.Diagnostics.Stopwatch();
            watch.Start();
            
for (int i = 0; i < 200000; i++)
            {
                
try
                {
                    
if (a != null)
                    {
                        a.ToString();
                    }
                }
                
catch
                { }
            }
            watch.Stop();
            System.Console.WriteLine(watch.ElapsedMilliseconds);
            Console.Read();
            }

本机的结论是:0毫秒

性能杀手之异常霸气外露!找死!

 

这里只是想最直白的说明一下:加一个判断,并不影响性能。

 

2:循环1次,抛异常并捕获

 

        static object a;
        
static void Main(string[] args)
        {
            System.Diagnostics.Stopwatch watch 
= new System.Diagnostics.Stopwatch();
            watch.Start();
            
for (int i = 0; i < 1; i++)
            {
                
try
                {
                    
//if (a != null)
                    
//{
                        a.ToString();
                    
//}
                   
                }
                
catch
                {
 
                }
            }
            watch.Stop();
            System.Console.WriteLine(watch.ElapsedMilliseconds);
            Console.Read();

本机的结论是:2毫秒

性能杀手之异常霸气外露!找死!

 

这里只是想最直白的说明一下:1个异常的抛出的时间,能挡住60万次的判断。

这个结论同时表明:加判断,并不是不重视性能,反而正是性能最直白的体现。

 

在个人的印象中,前人就有文章指出异常对性能的影响,当然这个可能年代太久了,大伙没啥印象了。

今天本人只是换个角度,换个方式,去传达这么一种理念:异常应该避免,而不是捕获,捕获,那是不得已而为之。

 

这里再顺路推出微软一个让人纠心的未处理的异常:Dictionary<T,T>的Add方法:

if (!dic.ContainsKey(key))
{
   
try
    {
        dic.Add(key, info);
    }
    
catch
    {
    
//反编绎微软内部调用:private void Insert(TKey key, TValue value, bool add) 可能会抛异常:Index was outside the bounds of the array
    }
}

正常的写法,是不用加try catch,可是微软也不是百分百完美的,就像我下面注释的异常,有一定的小概率会抛异常出来,不得已捕获之。

 

好,懂事的看完上面的内容,基本都明白事理了,下面再扯几句给不怎么懂事的清闲清闲:

 

霸气外露!找死!-- 这是发哥在让子弹飞的话,今天借来一用!

 

这里从两个角度上发挥一下:

 

1:假设我们很注重性能

 

假充我们很注重性能:现在我们明白了,一个异常不经易的抛出,就害我们损失了60万次的判断,唉哟妈喂,这得吓死多少千年虫!

以前常整天忙碌在用S好还是用B好,精心设计来设计去,减少来减少去,折腾来折腾去还不一定有60万这么大数字,现在一看,蒙了!

原来家里还有这么一只超级大老鼠,整天吃性能,以前竟然没发现!!!不过今天。。。

 

异常霸气外露!找死!

 

霸气外露,遇到我们这群性能执法者,纯找死!得把你给灭了,灭一个就是省60万,灭两个就是省120万,灭多几个,房子车子全有着落了!

 

2:假我们不是很关注性能

 

假设我们不是很关注性能:一个异常2毫秒,多大点屁事,60万次判断?你家的啥CPU?没个上百次你都不好意思上来说了。

反正秒级以下的都问题不大:抛500个异常也无所谓了,就一两秒的时间。

G要的是稳定,稳定!!!明了?
 

不过话说回来,虽然不在乎点时间,可是这。。。

 

异常霸气外露!找死!

 

我们领导最恨的就是异常,还霸气外露,露多几下G这饭碗还能握的住么?不行,不管什么异常,得坚决的消灭,消灭不掉的,得藏起来,坚决不能让它外露!

 

这不,那个车头不就是霸气外露,才被埋的么!!! 

 

顺路PS: CYQ.Data V4.5离线帮助文档,很快发布,敬请关注。

 

版权声明:程序员胖胖胖虎阿 发表于 2022年9月14日 下午6:00。
转载请注明:性能杀手之异常霸气外露!找死! | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...