编写高性能C#代码 —— Span<T>】的更多相关文章

多年来,Javascript一直在web应用开发中占据重要的地位,但是很多开发者往往忽视一些性能方面的知识,特别是随着计算机硬件的不断升级,开发者越发觉得Javascript性能优化的好不好对网页的执行效率影响不明显.但在某些情况下,不优化的Javascript代码必然会影响用户的体验.因此,即使在当前硬件性能已经大大提升的时代,在编写Javascript代码时,若能遵循Javascript规范和注意一些性能方面的知识,对于提升代码的可维护性和优化性能将大有好处. 下面给出编写高性能的Javas…
减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少GC回收时的压力,同时降低了内存碎片与CPU的使用量.你可以用一些方法来达到这一目的,但它可能会与其它设计相冲突. 你需要在设计对象时仔细检查每个它并问自己: 我真的需要这个对象吗? 这个字段是我需要的吗? 我能减少数组的尺寸吗? 我能缩小primitives的尺寸吗(用Int32替换Int64,其它)? 这些对象,是否只有在极少数情况下,或者只有初始化的时候才用到? 是否能将一些类转为结构体使他们在栈上分配或者成为某个对象的一部分?…
本章介绍了本书其它部分未涉及到的一些编码和设计原则.包含了一些.NET的应用场景,有些不会造成太大危害,有些则会造成明显的问题.剩下的则根据你的使用方法会产生不同的效果.如果要对本章节出现的原则做一个总结,那就是: 过度的优化会影响代码的抽象 这意味着,当你希望更高的优化性能,你需要了解每个层次代码的实现细节.本章会有很多相关介绍. 类 vs 结构体 类的实例都是在堆上分配的,通过指针的引用进行访问.传递这些对象代价很低,因为它只是一个指针(4或者8直接)的拷贝.然而,对象也有一些固定开销:8或…
本篇是 Writing High-Performance .NET Code 的目录索引,翻译内容不定时更新,目录也会同步修改. 性能测量及工具 选择什么来衡量 平均数vs百分比 工具介绍 Visual Studio 性能计数器 ETW事件 PerfView CLR Profiler Windbg Measurelt 内部测试代码 SysInternals 工具集 数据库 其他工具 垃圾回收 基本操作 基本选项 工作站与服务器 后台GC 低延迟模式 减少分配率 最重要的规则 缩短对象的生命周期…
<<返回目录 Visual Studio vs虽然不是全宇宙唯一的IDE,但它是.net开发人员最常用的开发工具.它自带一个性能分析工具,你可以使用它来做开发,不同的vs版本在工具上会略有差别. VS可以分析CPU使用率,内存分配以及资源锁情况.它能在你开发与运行中对项目做综合的测试. 它很强大,可以准确的测量运行了生产环境数据的大型应用程序.但是它集成在vs里面,如果你希望在生产环境下使用,需要有一个独立的性能监控工具.这个微软帮你想好了,从vs2013以后的版本里,在安装光盘里有一个独立版…
返回目录 第二章:垃圾回收 垃圾回收是你开发工作中要了解的最重要的事情.它是造成性能问题里最显著的原因,但只要你保持持续的关注(代码审查,监控数据)就可以很快修复这些问题.我这里说的"显著的原因",实际上是我们对垃圾回收的理解和期望不正确导致的.在.NET开发中,内存的性能问题和CPU的性能问题一样多,这就是单独开一章主要描述这个问题的原因. 当我们提及垃圾回收造成的开销时,就会不如自主的紧张起来,但一旦你理解它,就能很好的优化你的程序.在后面文章里,你可以看到GC可以在大多数情况下,…
配置选项 在基于"less rope to hang yourself with"思想下,.NET 框架没有给开发提供很多太多的配置选项.但在大多数情况下,GC会跟你的硬件配置,及可用资源以及程序自己的行为做调整.当然也提供一些高级的配置使用,但这取决于你程序的类型. 工作站与服务器 你首要的是为应用选择是在工作站还是服务器模式下运行. 系统默认为工作站模式.在这种模式下,GC在触发回收时,回收线程与当前主线程的优先级一样.对于简单的应用程序,特别是存在工作站里有多个托管进程需要做交互…
避免使用终结器 如果没有必要,是不需要实现一个终结器(Finalizer).终结器的代码主要是让GC回收非托管资源用.它会在GC完成标记对象为可回收后,放入一个终结器队列里,在由另外一个线程执行队列里对象的终结器方法.这就意味着,如果你实现一个类的终结器,你必须保证在它在终结器执行后能被正常回收.这需要消耗一些CPU资源在清理对象上,会极大降低GC的整体效率. 如果你实现一个终结器,你也必须实现一个IDisposable接口用来清理资源,并在Dispose方法里调用GC.SupperessFin…
将长生命周期对象和大对象池化 请记住最开始说的原则:对象要么立即回收要么一直存在.它们要么在0代被回收,要么在2代里一直存在.有些对象本质是静态的,生命周期从它们被创建开始,到程序停止才会结束.其它对象显然不需要永远存在下去,但他们的生命周期会存在程序的某些上下文里.它们的存活时间会超过0代(1代)回收.这些类型的对象可以作为池化对象的备选.这虽然需要你手动管理内存,但实际情况下这是一个很好的选择.另外一个重要的需要池化的对象是分配在LOH里的大对象. 没有一个单一的标准方案或者API来实现对象…
减少大对象堆的碎片 如果不能完全避免大对象堆的分配,则要尽量避免碎片化. 对于LOH不小心就会有无限增长,但LOH使用的空闲列表机制可以减轻增长的影响.利用这个空闲列表,我们可以在两块分配区域中间找到你所想要的可分配区域. 要做到这一点,就需要保证你在LOH里的分配都按照同一个尺寸或者同一个尺寸的倍数进行.例如,一个常见的需求是在LOH里分配缓冲区.要确保分配的每个缓冲区都是一个大小,或者是一个知名数字(1M)的倍数,而不要创建大小不一的缓冲区.这样做的话,如果一个缓冲区被回收,那么下一个缓冲区…