如何写出高性能的.net程序

本文是一个小工作总结。 总结这么久的性能优化经验。

有一次电话面试, 面试官说我简历里提到了性能优化, 他问我性能优化有什么章法吗?给他说说。 

我当时真迷糊了。 真的,做了这么久的性能优化还真不知道性能优化有什么章法。 

一直是自己凭感觉乱弄, 运气比较好, 还真的可以弄到点子上, 运行时间急剧缩短。 

一提起优化, 大家第一反应就是算法。 

不过说来惭愧, 我这种懒人, 对算法最一头雾水了, 算法导论买回来看了前几页就扔那压东西了, 

现在好像还丢了。 不知道哪次搬家弄没了。 

所以本文的主要核心就是如何在不懂算法的前提下, 进行性能优化。 

从现在开始开启干货模式

===================================

提高性能的核心思想就是: 别犯二

1 别犯二之:少做没用的事情

最简单的一件事, 

就只是让你写个函数:提取出最大的那个数。

你非写个排序算法出来然后选top 1, 你这不找抽吗。

就只是让你看字符串是否匹配正则表达式, 你非把正则表达式execute一次,连分组都提取完了然后一看说哦, 符合

这不是自找苦吃吗?

就只是让你生个孩子你非要找个帅哥结婚。。。。

哎, 不多说了。 

2 别犯二之:少做“可扩展性”设计

第一次被教训是校园招聘的时候。 人家让写个函数, 输出所有小于10的5次方的数字。 

我们写了个“返回M的N次方”的函数, 并且运算出个结果, 然后再去for循环。 

结果我们全被刷了。 

后来有人过了。 

我们问它咋写的?

他说:for(int i = 0; i < 100000;i++).......

尼玛。

时刻记住:你做十次“可扩展性设计”,有九次是没用的。 

还有一次会被后人重构一次, 然后才有用。 

写出“容易重构”的代码就足以。 重构的人已经知道哪里需要“可扩展”了, 他们才是最适合做“可扩展性”的人。 

哪怕这个人可能是未来的你。 

3 别犯二之:别信测试数据,尤其是运行时间。 

第一次接受教训是工作第一年, 公司内部一个讲座。 

一个人写了个程序, 来证明StringBuilder比拼String更快。

然后写完了有个人站出来说, 你的结论虽然是对的, 但是你这个测试数据是不对的。 你每次拼string的时候都调用两次Console.WriteLine, 用StringBuilder的时候却用了一次, 你这实际上是作弊帮人家赢取比赛。

我们都有过这种经历吧:数学课, 证明题, 每个人都证明出来了, 但是有人得分有人不得分。

得分的同学过程大差不差, 做错的人则是千奇百怪, 但是神奇的是, 他们居然也能证明出这个结论。

充分证明了, 过程不靠谱, 结论才重要。 而测试数据, 就是个用于推导“谁更快”的过程。

4 别犯二之:别跟测试结果叫号。

这条看起来似乎和3冲突, 实际上。。。

有的时候确实有点冲突。

当测试结果说, 你这个性能有问题, 这时候大部分人的想法是:

你测错了吧?我的代码怎么会有问题。

当产生这个疑问的时候, 十有八九是你的代码有问题。

5 别犯二之:先做基础优化

做sql server查询优化连个索引都不加你优化个鬼啊!

做C#你连调用次数都统计不出来你优化谁啊?

做JavaScript优化你连全局变量都没搞定你还考虑什么性能啊!

基础优化做完可以解决90%的性能问题。

我在公司一直重复一句话:

给sql加索引可以解决90%的查询性能问题, 剩下10%的问题应该让DBA去处理。

6 别犯二之:转移压力

不要以为运行时间短才叫性能优化, 有的时候运行时间一秒不少, 让用户感觉快了, 也叫优化。

最典型的就是把JavaScript文件放到body的末尾。

有的人认为这是奇技淫巧, 但是实际上这相当有效。

如果你的JavaScript文件比较大, 可能需要一秒钟才能下载完, 那么在下载期间你的网页就是一片空白。

而放到结尾, 虽然还没下载完, 但是网页已经可以用了!

对于用户来说, 这就是快!

还有就是先把网页加载完, 图片和一些不重要的js在后台慢慢去load

这些都是出于相同的目的:让“感觉”变快。 

7 别犯二之: 重复运算。

大部分所谓的优化只是去掉了重复运算的代码。

否则业务逻辑半点没删, 凭什么运行速度比以前快?

前人犯二, 后人填坑, 我们称之为优化而已。 

举个例子, 我以前见过一个数据库导入导出的程序, 

分别读取了来自新加坡的一个表, 澳大利亚的一个表, 还一个位于美国的表。 

还进行了一堆运算, 然后由于网速很慢, 跑一次要一分钟。 

这也是没办法的事情对吧?

可是他在一个for里面不断的做这个事情!

而后来的优化则相当让人喷饭。

程序员看了下, 表不大, 直接读出来放本地,

一下子搞定了一切。 运行时间从5个小时优化成了三分钟。

尼玛, 这不是坑爹吗。 这是做优化的程序员牛逼吗?

不是, 这是前人犯的二, 太严重。

总体先说这些。 因为我发现下班时间到了。

时间: 2024-10-12 19:33:57

如何写出高性能的.net程序的相关文章

代码示例:一些简单技巧优化JavaScript编译器工作详解,让你写出高性能运行的更快JavaScript代码

告诉你一些简单的技巧来优化JavaScript编译器工作,从而让你的JavaScript代码运行的更快.尤其是在你游戏中发现帧率下降或是当垃圾回收器有大量的工作要完成的时候. 单一同态: 当你定义了一个两个参数的函数,编译器会接受你的定义,如果函数参数的类型.个数或者返回值的类型改变编译器的工作会变得艰难.通常情况下,单一同态的数据结构和个数相同的参数会让你的程序会更好的工作. function example(a, b) { // 期望a,b都为数值类型 console.log(++a * +

小程序初体验:手把手教你写出第一个小程序(一)

本文笔者将根据quick start中的范例代码,带大家简单地剖析一下小程序的运行方式,并介绍小程序开发中一些通用的特性,带着大家一步步写出自己的小程序. 适用对象:前端初学者,对小程序开发感兴趣者 tips:由于笔者也是一位前端菜鸟,所以尽量用简单直白的语言为大家讲解,如有说的不到位的地方,还望多多指教. 吊了我们一年胃口的小程序终于和大家见面了.经过了一天的发酵,小程序已经成为了今天的超级头条(汪汪哭晕在厕所). 经历了一天媒体对小程序的狂轰滥炸,相信大家对于小程序一定充满了好奇.与其跟风转

如何写出高性能的SQL语句(转)

高性能的SQL语句能提高页面的执行效率,让你的服务器运行的更为流畅,所以大家在以后的使用过程中,尽量的考虑到效率. (1)整合简单,无关联的数据库访问: 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) (2)删除重复记录: 最高效的删除重复记录方法 ( 因为使用了ROWID)例子: DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP

[译]C++ WEB编程:写出你的CGI程序

一.什么是CGI      CGI(The Common Gateway Interface):通用网关接口,定义web服务器和客户脚本进行信息交互的一系列标准. 二.WEB浏览器       为了了解CGI的概念,让我们来看看当我们单击一个超链接来浏览一个特定的web页或URL的时候,背后会发生什么事?       (1)浏览器首先会链接HTTP web 服务器并且请求一个URL 页面:       (2) WEB服务器将会解析这个URL并且查询请求的文件名,如果找到了请求文件服务器就会将这个

如何写出高性能的sql语句?

(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACLE采用自下而上的顺序解析WHER

如何写出高性能的SQL语句

1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择"索引查找"方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 "全表扫描"方式. 可见,执行计划并不是固定的,它是"个性化的".产生一个正确的"执行计划"有两点很重要:

Sql Server 优化 SQL 查询:如何写出高性能SQL语句

1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 “全表扫描”方式. 可见,执行计划并不是固定的,它是“个性化的”.产生一个正确的“执行计划”有两点很重要: (1)    SQL语句是否清晰地告诉查询优化器它想干什么? (2)

优化SQL查询:如何写出高性能SQL语句

1.首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句,如果用来从一个10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用“全表扫描”方式. 可见,执行计划并不是固定的,它是“个性化的“.产生一个正确的”执行计划“有两点很重要: (1)SQL语句是否清晰地告诉查询优化器它想干什么? (2)查询优化器得到

如何写出高性能SQL语句(文章摘自web开发者)

(声明:本文内容摘自web开发者,仅供收藏学习之用,如有侵权请作者联系博主,博主将在第一时间删除) 原文地址:http://www.admin10000.com/document/484.html 1.首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生欀如一条SQL语句如果用来从一个10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变