.NET性能优化 一

知道自己不知道。

性能指标主要包括以下内容

性能指标测量单位
CPU使用率百分比
物理/虚拟内存占用字节(B/KB/MB/GB)
缓存失效次,次/秒
页面失效次,次/秒
数据库访问次数及耗时次,次/秒,毫秒(ms)
执行事件毫秒(ms)
网络操作次,次/秒
磁盘操作次,次/秒
响应时间毫秒(ms)
垃圾回收次,次/秒,耗时(毫秒),占总时间百分比
抛出异常次,次/秒
启动时间毫秒(ms)
竞争次,次/秒

在开始分析问题之前,需要定义性能类型,是CPU占用率,内存占用率,还是操作速度块。

分析CPU占用情况

用PerfView或者Visual Studio 的Standalone Profiler获取CPU跟踪数据。

对显示出来的函数调用栈进行分析

数据处理过程耗费时间是否过长?

能修改数据结构以减少处理时间么?比如用简单的二进制替代XML解析

有性能更好的API可替换吗?

能用Task或Parallel.For并行处理吗?

分析内存占用情况

采用正确的垃圾回收模式

服务器模式:你的应用程序是机器上唯一重要的应用,需要延迟最低的垃圾回收

工作站模式:你的应用程序带有UI,或者与其他的重要进程共用一台机器

用PerfView跟踪内存的使用情况:

检查顶层的分配:是否服务预期且可被接受?

密切关注大对象的分配

如果第二代垃圾回收过于频繁

是否发生大量的LOH分配?没法去掉这些对象,或者进行池化。

对象的内存“代数”有否获得提升?缩短对象的生存期以便过低垃圾回收进行清理。按需分配对象并在不用时设置为null。

如果对象存活太久,就进行池化

如果第二代垃圾回收耗时太久

考虑使用GC通知,一遍在即将发生垃圾回收时获得消息,成绩停止程序的处理。

如果第0/1代垃圾回收过于频繁:

查看跟踪日志中内存分配量最多的部分,没法减少分配需求

尽量缩短对象的生存期

如果第0/1代的垃圾回收导致的暂停响应时间过长

减少内存分配总量

尽量缩短对象的生存期

对象是否被固定住了?尽可能消除这些对象,或者缩小固定对象的作用域。

移除对象间的互相引用,降低对象的复杂度。

如果LOH不断增大

用Winbg或者CLR Profiler检查内存段

定期对LOH堆进行随便整理

检查对象池是否无节制地增长

分析JIT

如果启动时间较长

是否真的是因为JIT?更为常见的原因是正在加载数据

用PerfView找出JIT编译时间较长的方法体

用Profile Optimization 加速程序启动时的JIT过程

考虑使用NGEN

分析结果中是否出现本应进行行内联编译的方法体?

查看被组织内联的这些方法,被阻的原因可能时因为循环,异常处理,递归等。

分析步执行性能

用PerfView确定是否有大量的竞态存在

通过重构代码,减少锁的需求,以减少竞态

用PerfView捕获Thread Time事件,检查耗时情况。分析代码,确保线程不会阻塞在I/O上。

你也许得对程序做出重大改进,在各个层级增加异步执行程度,以避免Task或I/O的等待。

确保使用了以部的流API

程序在启用线程池之前是否得等待一段时间?这有可能表现为启动程序比较缓慢,几分钟之内无法投入使用。

确认线程池得最小线程数参数是否满足需要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值