您的位置:首页 > 其它

随时保持理性思考的态度

2009-09-09 21:57 609 查看
你的思维模式是怎么样的,你是如何思考和解决你从未想过的问题?如何去寻找较正确靠谱的方式去处理事情呢?这篇文章将向大家分享我的方法。

先向大家问个问题:亚洲的陆地面积大概是多少?(不许搜索不许翻书,先自己估算一下,答案在文章最后)

我的回答是3500万平方公里,我是怎么作出这样的答案的呢,我不是瞎猜的。首先我学过地理,我知道中国陆地面积是960万平方公里,就大概算成是1000万平方公里吧,我印象里从地图上看,俄罗斯的亚洲部分大概比中国大一点,印度版图比中国小一点,差不多就当2个中国面积吧,这样就有了3000万平方公里,然后算上什么韩国日本越南什么东南亚一块,我就估算出了3500万平方公里的面积。

这个例子说明,我是利用我现有能掌握的各项信息,来作出判断。我面对从未处理过的事情时,都是以理性思考的态度去想解决方案。事实上,上面的题目我估算少了一些,看看亚洲地图,我忘记算上西亚了,那块富的流油又老打仗的地方。中国的西边还很大一块呢。犯下这个错误说明我初中地理没学好-_-!!



让我想到这个态度问题,主要是今天遇到个事情很郁闷,有个网站有个系统功能出现了性能问题,一个页面点了3-5分钟都还打不开,明显是有什么地方死循环了,我后来解决了。说说我是怎么处理的吧:

1、先把页面上其他的控件都删除,排除到只剩目标控件,先证明是这个控件出了问题。用事件探查器分析一下SQL,发现没有执行什么SQL语句,说明数据层是正常的,不存在循环读数据的BUG。

2、控件中的方法逐步清理掉,只留下影响性能的那几个。我要想办法计算方法执行时间,先查了一下还有用什么MethodPerfMonitor这种玩意的,我搞了一下没成功,大概web的不适用。我后来想反正是计算时间嘛,我又不要多精确,直接输出了DateTime.Now,就达到目的了,在方法开始和结束的地方输出当前时间,精确到秒,很快确定了是某个方法的问题,直到看到是某行代码的执行时间超长,是个Pages.GetList(),从底层调用的。

3、现在表现层看来查不出什么了,找出项目的源代码,继续找Pages.GetList()方法,发现里面还有几个对象的嵌套什么的,还用了缓存,我想这缓存难道是没发挥作用?打上断点调试了一下,缓存没问题,都顺利填充和取出了。

4、在底层的Pages.GetList()中找到了Subject.GetList()的方法,就是说这个方法是递归出来的,我在每个方法上用System.Diagnostics.WriteLine()输出当前DateTime,编译了执行,发现有个方法花了6秒执行,被执行了7次,就是说这一下子就可以用掉42秒的时间来读出Pages.GetList(),难怪慢了!

5、我将每一层嵌套的方法上全都输出当前时间,并且输出了毫秒,以便查出具体是哪里有很大的消耗,发现很可怕,每一个方法都只有30毫秒左右就完成了,但执行了近3000次,这种嵌套的结构想递归出来代价居然这么大!我为了读出一个顶级的对象,下面有几千个子对象从缓存中读出,我本以为从缓存中取出对象是个很轻易的事,没想到数量一大会这么大影响。

6、找到原因了:由于缓存的方式和时机不正确,将具体的对象全部都进行了缓存,而不是直接缓存对象集合,造成这么个诡异的性能问题。有了原因就很容易解决问题了,

这个事件的结论:

1、看似复杂的问题,通过层层剥离和分析,也是可以分解成细微的各种原因,从而找到改进方法。

2、使用.net缓存一定要注意周遍环境和时机,缓存要质量不要数量。

上面亚洲面积的问题答案是:4400万平方公里,看看百度百科学习一下亚洲的地理知识
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: