该资源由用户: 魂魄壬申 上传 举报不良内容
本书详细介绍了如何编写高性能的.NET程序,在zui大化托管代码性能的同时,还能保证.NET的特性优势。 本书循序渐进地深入.NET的各个部分,特别是底层的公共语言运行时(Common Language Runtime,CLR),了解CLR是如何完成内存管理、代码编译、并发处理等工作的。本书还详细介绍了.NET的架构,探讨了编程方式如何影响程序的整体性能,在全书中,还分享了发生在微软的一些趣闻轶事。本书的内容偏重于服务器程序,但几乎所有内容也同样适用于桌面端和移动端应用程序。 本书条理清楚,言简意赅,适合有一定.NET基础的读者和想要提高代码性能的C#程序员学习参考。
第1章性能评估及工具 1
1.1选择评估内容 1
1.2平均值还是百分位值 3
1.3评估工具 4
1.3.1Visual Studio 5
1.3.2性能计数器 7
1.3.3ETW事件 13
1.3.4PerfView 15
1.3.5CLR Profiler 18
1.3.6Windbg 20
1.3.7.NET IL分析器 24
1.3.8MeasureIt 25
1.3.9代码中的工具 25
1.3.10SysInternals工具 26
1.3.11数据库 26
1.3.12其他工具 27
1.3.13评估本身的开销 27
1.4小结 27
第2章垃圾回收 28
2.1基本运作方式 30
2.2配置参数 33
2.2.1工作站模式还是服务器模式 33
2.2.2后台垃圾回收 34
2.2.3低延迟模式
(Low Latency Mode) 35
2.3减少内存分配量 36
2.4首要规则 37
2.5缩短对象的生存期 37
2.6减少对象树的深度 38
2.7减少对象间的引用 38
2.8避免对象固定 38
2.9避免使用终结方法 39
2.10避免分配大对象 40
2.11避免缓冲区复制 41
2.12对长期存活对象和大型对象进行
池化 41
2.13减少LOH的碎片整理 45
2.14某些场合可以强制执行完全
回收 46
2.15必要时对LOH进行碎片
整理 47
2.16在垃圾回收之前获得通知 47
2.17用弱引用作为缓存 50
2.18评估和研究垃圾回收性能 51
2.18.1性能计数器 51
2.18.2ETW事件 52
2.18.3垃圾回收的耗时 53
2.18.4内存分配的发生时机 54
2.18.5查看已在LOH中分配内存的
对象 55
2.18.6查看内存堆中的全部对象 57
2.18.7为什么对象没有被回收 60
2.18.8哪些对象被固定着 61
2.18.9内存碎片的产生时机 63
2.18.10对象位于第几代内存堆中 67
2.18.11第0代内存堆中存活着哪些
对象 68
2.18.12谁在显式调用GC.Collect
方法 70
2.18.13进程中存在哪些弱引用 70
2.19小结 71
第3章JIT编译 72
3.1JIT编译的好处 73
3.2JIT编译的开销 73
3.3JIT编译器优化 75
3.4减少JIT编译时间和程序启动
时间 76
3.5利用Profile优化JIT编译 78
3.6使用NGEN的时机 78
3.6.1NGEN本机映像的优化 79
3.6.2本机代码生成 80
3.7JIT无法胜任的场合 80
3.8评估 81
3.8.1性能计数器 81
3.8.2ETW事件 82
3.8.3找出JIT耗时最长的方法和
模块 82
3.9小结 83
第4章异步编程 84
4.1使用Task 86
4.2并行循环 89
4.3避免阻塞 92
4.4在非阻塞式I/O中使用Task 92
4.4.1适应Task的异步编程模式 94
4.4.2使用高效I/O 96
4.5async和await 97
4.6编程结构上的注意事项 99
4.7正确使用Timer对象 100
4.8合理设置线程池的初始大小 101
4.9不要中止线程 102
4.10不要改变线程的优先级 102
4.11线程同步和锁 103
4.11.1真的需要操心性能吗 103
4.11.2我真的需要用到同步锁吗 104
4.11.3多种同步机制的选择 105
4.11.4内存模型 106
4.11.5必要时使用volatile 106
4.11.6使用Interlocked方法 108
4.11.7使用Monitor(锁) 110
4.11.8该在什么对象上加锁 112
4.11.9异步锁 112
4.11.10其他加锁机制 115
4.11.11可并发访问的集合类 116
4.11.12使用更大范围的锁 116
4.11.13替换整个集合 117
4.11.14将资源复制给每个线程 118
4.12评估 118
4.12.1性能计数器 118
4.12.2ETW事件 119
4.12.3查找争用情况最严重的锁 120
4.12.4查找线程在I/O的阻塞位置 120
4.12.5利用Visual Studio可视化展示
Task和线程 121
4.13小结 122
第5章编码和类设计的一般规则 123
5.1类和“结构”的对比 123
5.2重写“结构”的Equals和
GetHashCode方法 126
5.3虚方法和密封类 128
5.4接口的分发(Dispatch) 128
5.5避免装箱 129
5.6for和foreach的对比 131
5.7强制类型转换 133
5.8P/Invoke 134
5.9委托 136
5.10异常 137
5.11dynamic 138
5.12自行生成代码 141
5.13预处理 146
5.14评估 146
5.14.1ETW事件 146
5.14.2查找装箱指令 147
5.14.3第一时间发现“异常” 149
5.15小结 150
第6章使用.NET Framework 151
6.1全面了解所用API 151
6.2多个API殊途同归 152
6.3集合类 152
6.3.1泛型集合类 153
6.3.2可并发访问的集合类 154
6.3.3其他集合类 156
6.3.4创建自定义集合类型 156
6.4字符串 157
6.4.1字符串比较 157
6.4.2ToLower和ToUpper 158
6.4.3字符串拼接 158
6.4.4字符串格式化 158
6.4.5ToString 159
6.4.6避免字符串解析 159
6.5应避免使用正常情况下也会抛出
“异常”的API 159
6.6避免使用会在LOH分配内存的
API 159
6.7使用延迟初始化 160
6.8枚举的惊人开销 161
6.9对时间的跟踪记录 162
6.10正则表达式 164
6.11LINQ 164
6.12读取文件 165
6.13优化HTTP参数及网络
通讯 166
6.14反射 167
6.15评估 168
6.16性能计数器 168
6.17小结 169
第7章性能计数器 170
7.1使用已有的计数器 170
7.2创建自定义计数器 171
7.2.1Averages 172
7.2.2Instantaneous 173
7.2.3Deltas 173
7.2.4Percentages 173
7.3小结 174
第8章ETW事件 175
8.1定义事件 175
8.2在PerfView中使用自定义
事件 178
8.3创建自定义ETW事件
Listener 179
8.4获取EventSource的详细
信息 184
8.5自定义PerfView分析插件 186
8.6小结 189
第9章Windows Phone 190
9.1评估工具 190
9.2垃圾回收和内存 191
9.3JIT 191
9.4异步编程和内存模式 192
9.5其他问题 193
9.6小结 193
第10章代码安全性 194
10.1充分理解底层的操作系统、API
和硬件 194
10.2把API调用限制在一定范围的
代码内 194
10.3把性能要求很高、难度很大的
代码集中起来并加以抽象 199
10.4把非托管代码和不安全代码
隔离出来 200
10.5除非有证据证明,不然代码清晰
度比性能更重要 200
10.6小结 200
第11章建立追求性能的开发团队 201
11.1了解最影响性能的关键
区域 201
11.2有效的测试 201
11.3性能测试平台和自动化 202
11.4只认数据 203
11.5有效的代码复查 203
11.6 训练 204
11.7 小结 205
附录A尽快启动对应用程序的性能
讨论 206
定义指标 206
分析CPU占用情况 206
分析内存占用情况 206
分析JIT 207
分析异步执行性能 207
附录B大O表示法 209
常见算法及其复杂度 211
排序算法 211
图论算法 211
查找算法 212
特殊案例 212
附录C参考文献 213
参考书籍 213
相关人士及博客 213
尊敬的读者:
欢迎您访问我们的网站。本站的初衷是为大家提供一个共享学习资料、交换知识的平台。每位用户都可以将文件上传至网盘并分享。
然而,随着用户上传的资料增多,我们发现部分不宜或版权问题的书籍被分享到了本站。
为此,我们已经关闭了分享入口,并进行了多次书籍审查,但仍有部分内容未能彻底审查到位。
在此,我们恳请广大读者与我们共同监督,如发现任何不宜内容,请 点击此处 进行举报,我们会第一时间处理并下架相关内容。
希望我们能共建一个文明社区!感谢您的理解与支持!