构建高性能ASP.NET站点 第七章 如何解决内存的问题(后篇)—托管资源优化—监常用优化措施

简介:


构建高性能ASP.NET站点 第七章 如何解决内存的问题(后篇)—托管资源优化监常用优化措施

 
前言:有段时间没有写这个系列了,希望大家见谅,本篇主要将会介绍一些常用的CLR优化措施.
 
本篇的议题如下:
内存问题概述(前篇)
托管资源优化(前篇)
         对象的生命周期(前篇)
         对象的代“(前篇)
         大对象堆(LOH) (前篇)
         CLR计数器的使用         (中篇)
         CLR Profiler的使用(中篇)
         垃圾回收器的不同版本(中篇)
         对象使用注意事项(后篇)
         常用优化措施(后篇)
非托管资源优化
Session会话的优化  
 
对象使用注意事项
   在之前的内容,我们讲述了CLR的托管堆的相关知识,同时也讲述了CLR的垃圾回收机制,对于对象,言有一点要记住:尽可能晚的创对象。目的是使得对象的“代”尽可能的小,让没有必要生存很长时间的对象尽可能早的被回收。
 
   下面是对象使用的注意事项:
1.  不要过早的创建大对象,然后再很久之后才用,而是在要用的才创建,如下:
 
不要这样:
 
InBlock.gifLargeObject largeObject = new LargeObject(); 
InBlock.gif 
InBlock.gif// Long running database call ... 
InBlock.gif 
InBlock.giflargeObject.MyMethod(); 
InBlock.gif 
而要这样:
 
InBlock.gif// Long running database call ... 
InBlock.gif 
InBlock.gifLargeObject largeObject = new LargeObject(); 
InBlock.gif 
InBlock.giflargeObject.MyMethod(); 
InBlock.gif 
同样,这个原则也适用于消耗资源很多的对象,例如Transaction事务对象,要尽可能晚的打开事务,尽可能早的关闭事务。
 
2.  如果在.NET4 中,可以考虑使用Lazy<T>。它可以使得我们定义事先定义一个对象,知道需要的时候才实例化它。如下:
InBlock.gifLazy<ExpensiveObject> expensiveObject = new Lazy<ExpensiveObject>(); 
InBlock.gif 
通过以下语句在需要时,获取这个对象:
 
InBlock.gifexpensiveObject.Value; 
InBlock.gif 
 
3. 对于确定不再需要的对象,尽早的释放,将其引用设为null,如下:
InBlock.gifLargeObject largeObject =  new LargeObject(); 
InBlock.gif 
InBlock.gif // Create reference from long lived object to new large object 
InBlock.gif 
InBlock.giflongLivedObject.largeObject = largeObject; 
InBlock.gif 
InBlock.gif // Reference no longer needed 
InBlock.gif 
InBlock.giflongLivedObject.largeObject =  null
 
常用优化措施
1. 使用StringBuilder进行字符串拼接
不要这样:
 
InBlock.gif string s = ""; 
InBlock.gif 
InBlock.gif for ( int i = 0; i < stringArray.Length; i++) 
InBlock.gif
InBlock.gif 
InBlock.gif     s += stringArray[i]; 
InBlock.gif 
InBlock.gif
要这样:
InBlock.gifStringBuilder sb =  new StringBuilder(capacity); 
InBlock.gif 
InBlock.gif for ( int i = 0; i < stringArray.Length; i++) 
InBlock.gif
InBlock.gif 
InBlock.gifsb.Append(stringArray[i]); 
InBlock.gif 
InBlock.gif
InBlock.gif 
InBlock.gif string s = sb.ToString(); 
 
不要这样:
 
InBlock.gif // Concatenation results in new string object 
InBlock.gifsb.Append(stringArray[i] +  ","); 
InBlock.gif 
要这样:
 
InBlock.gifsb.Append(stringArray[i]); 
InBlock.gifsb.Append( ","); 
 
:
1.如果需要拼接的字符串超过了6个以上,那么就可以用StringBuilder,如果没有超过6个,那么可以直接将其拼接,两者区别不大。
2. 如果可以知道估算出字符串的长度,可以在使用StringBuilder拼接的时候,尽量的声明StringBuilder的容量,例如new StringBuilder(1000);因为如果不声明容量,StringBuilder的默认容量是16,如果字符串过长,那么CLR会重新为StringBuilder分配新的容量和内存,把原来的字符串copy过来,这样,原来的字符串保存空间就浪费,直到 CLR垃圾回收才释放。
2.使用Compare进行字符串的大小比较
比较字符串是否相等的时候,一般如下:
InBlock.gif if (s1.ToLower() == s2.ToLower()) 
InBlock.gif
InBlock.gif 
InBlock.gif
但是,这样会更好:
InBlock.gif if ( string.Compare(s1, s2,  true) == 0) 
InBlock.gif
InBlock.gif 
InBlock.gif
   因为在Compare方法比较的时候是一个字节一个字节的比较,这样会更快。
 
3.使用Response.Write来输出缓冲
ASP.NET中,采用Response.Write来讲数据发送到浏览器,
不要采用:
InBlock.gifResponse.Write(s1 + s2); 
要采用:
InBlock.gifResponse.Write(s1); 
InBlock.gifResponse.Write(s2); 
 
 


























本文转自yanyangtian51CTO博客,原文链接: http://blog.51cto.com/yanyangtian/518321  ,如需转载请自行联系原作者


 
 
相关文章
|
1月前
|
存储 缓存 安全
C语言中的内存管理与优化技巧
C语言中的内存管理与优化技巧
37 0
|
24天前
|
缓存 算法 Java
Java内存管理:优化性能和避免内存泄漏的关键技巧
综上所述,通过合适的数据结构选择、资源释放、对象复用、引用管理等技巧,可以优化Java程序的性能并避免内存泄漏问题。
26 5
|
1月前
|
存储 设计模式 缓存
C++享元模式探索:轻松优化内存使用和性能提升之道
C++享元模式探索:轻松优化内存使用和性能提升之道
41 0
|
1月前
|
存储 缓存 算法
深入探究LRU缓存机制:优化内存利用与提升性能
深入探究LRU缓存机制:优化内存利用与提升性能
133 1
|
1月前
|
缓存 资源调度 Go
内存模型与调度器在Go语言并发编程中的应用与优化
【2月更文挑战第16天】Go语言以其独特的并发编程模型而备受瞩目,其中内存模型和调度器是支撑其高效并发执行的关键机制。本文将探讨内存模型与调度器在Go语言并发编程中的应用场景,并介绍一些优化策略,帮助开发者更好地利用这些机制,提升程序的性能和稳定性。
|
1月前
|
监控 Java 编译器
Go语言内存与并发性能综合优化策略
【2月更文挑战第11天】Go语言以其高效的并发处理能力和简洁的内存管理机制成为了现代软件开发中的热门选择。然而,在实际应用中,如何综合优化Go程序的内存使用和并发性能,仍然是一个值得探讨的话题。本文将深入探讨Go语言内存与并发性能的综合优化策略,包括内存布局优化、并发模式设计、资源池化以及性能监控与分析等方面,旨在帮助开发者全面提升Go程序的整体性能。
|
1月前
|
Java 编译器 Go
Go语言内存管理优化实践
【2月更文挑战第11天】随着Go语言在各个领域的应用日益广泛,对其性能的要求也越来越高。内存管理作为影响程序性能的关键因素之一,对Go语言的优化显得尤为重要。本文将深入探讨Go语言的内存管理机制,并提供一系列实用的内存优化策略,帮助开发者更加高效地利用内存资源,提升Go程序的整体性能。
|
2月前
|
监控 Java 编译器
优化Go语言程序中的内存使用与垃圾回收性能
【2月更文挑战第5天】本文旨在探讨如何优化Go语言程序中的内存使用和垃圾回收性能。我们将深入了解内存分配策略、垃圾回收机制,并提供一系列实用的优化技巧和建议,帮助开发者更有效地管理内存,减少垃圾回收的开销,从而提升Go程序的性能。
|
2月前
|
存储 Rust 安全
Rust中避免不必要的内存分配与复制的优化策略
在Rust编程语言中,内存分配与复制是常见的性能瓶颈。本文深入探讨了如何在Rust中避免不必要的内存分配和复制,包括使用栈分配、借用与所有权、智能指针、以及零拷贝策略等。通过理解这些概念并应用相应的优化策略,Rust开发者可以显著提高代码的性能和效率。
|
2月前
|
缓存 Linux 数据库
Linux内存管理优化
Linux内存管理优化
40 0