常见的.NET开发性能优化面试题

1、谈谈你在之前工作中,有关于后端性能优化的经验!

答:代码层面优化,组建高性能Sql,

使用非关系内存数据库;

使用RDD,弹性分布式数据集 (Resilient Distributed DataSet)

增加缓存;使用SSD;使用多线程;分布式部署程序;.

2、谈谈你了解的缓存

答:本地缓存,分布式缓存,Memcache,Redis;Mongodb;

3、说说 123+”字符串” 和 123.Tostring() 的区别。

答:123+”字符串” 这种方法虽然简单,也可以得到正确结果,但是由于涉及到不同的数据类型,数字需要通过装箱操作转化为引用类型才可以添加到字符串中。使用值类型的ToString方法可以避免装箱操作,从而提高应用程序性能4

4、代码中出现 字符串A.ToUpper()==字符串B 或者 字符串A .ToLower()==字符串B,你会怎么处理?

答:字符串比较不区分大小写可优化为:String.Compare(字符串A,字符串B ,true) == 0 或者String.Compare(字符串A,字符串B ,true) == 0 

5、代码中出现 strCriteria.Trim() == "", strCriteria为字符串类型变量;你会怎么调整?

答:可调整为:strCriteria.length==0

6、说说装箱拆箱的为什么会有性能问题

答:装箱和取消装箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个全新的对象。内存拷贝,从引用类型转换成值类型,需要从堆拷贝到栈!处理器处理的事情多了,自然引发性能问题。

7、Object类型使用引发的性能问题,如何解决?

答:可以用泛型替代object的使用;

8、在多任务执行的时候,使用多线程,应该注意些什么

答:

  1. 是否适合使用多线程;

  2. 多线程临时变量问题,

  3. 线程数量的控制问题,并不是线程越多越好,线程也是需要系统开销的!

  4. 线程安全问题!

9、如果有100个任务需要执行,需要快速的去完成,使用多线程如何实现?是否开启100个线程?为什么?

答:100个任务开启100个线程去执行是不合理的,线程越多,系统的线程开销就越大,反而性能得不到保障,可以开启10个线程去执行,某一个线程的任务执行完毕,就紧接着执行下一个任务,线程控制在10个线程即可!可以使用Parallel,同时使用ParallelOptions控制线程数量。

10、说说在程序中连接数据库查询,如何避免一些性能问题?

答:

  1. 数据库连接不要频繁的打开和关闭

  2. 不要循环数据去查询数据库。

  3. 编写简洁的sql语句;

  4. 使用的数据源尽量一次性取出,业务逻辑处理由Web服务器处理;

  5. 不要一次取出体量太大的数据。

  6. 尽量不要使用数据库存储过程。

11、谈谈在写sql语句的时候,如何提高性能?

答:

  1. 统一Sql语句的写法,同一句sql语句,如果出现大小写不同,就是多个不同的执行计划;

  2. 不要把Sql写的过于复杂,尽量降低子查询的数量。

  3. 如果有中间数据,尽量使用临时表。

  4. 只有在必要的情况下,才使用事务;不要任何一句语句都加事务操作;

  5. 尽量少使用模糊查询like;

  6. 关联查询尽量少用;

  7. 尽量使用系统函数;

12、谈谈数据库的索引!使用索引需要注意些什么?

答:sqlserver中有多种索引类型:按存储结构区分:“聚集索引”,“非聚集索引”;按数据唯一性区分:“唯一索引”,“非唯一索引”。索引就和书本的目录一样,都是为了在查询的时候,能够尽快的定位到数据;下面我对索引的使用提一下建议:

选择较小的列创建索引,如果超过了900B的列不允许创建索引,组合索引最多限制是16个列,列宽之和要小于900B,注意索引的类型(聚集索引通常在标识列上),用Include索引取代组合索引,使用非聚集的Include索引涵盖查询,使用索引视图优化聚合计算(在不经常修改数据的表上),常用的列放在前面,不会作为查询条件的列可以放在Include中,确定哪些列应该创建索引(PK、FK、Unique常用于作为查询条件的列,Group by的列等),检查其他的索引是否是必须的(很少用到的索引,尽可能的去掉);