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

简介:


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

 
前言:有段时间没有写这个系列了,希望大家见谅,本篇主要将会介绍一些常用的CLR优化措施.
 
本篇的议题如下:
内存问题概述(前篇)
托管资源优化(前篇)
         对象的生命周期(前篇)
         对象的代“(前篇)
         大对象堆(LOH) (前篇)
         CLR计数器的使用         (中篇)
         CLR Profiler的使用(中篇)
         垃圾回收器的不同版本(中篇)
         对象使用注意事项(后篇)
         常用优化措施(后篇)
非托管资源优化
Session会话的优化  
 
对象使用注意事项
   在之前的内容,我们讲述了CLR的托管堆的相关知识,同时也讲述了CLR的垃圾回收机制,对于对象,言有一点要记住:尽可能晚的创对象。目的是使得对象的“代”尽可能的小,让没有必要生存很长时间的对象尽可能早的被回收。
 
   下面是对象使用的注意事项:
1.  不要过早的创建大对象,然后再很久之后才用,而是在要用的才创建,如下:
 
不要这样:
 
LargeObject largeObject = new LargeObject(); 
 
// Long running database call ... 
 
largeObject.MyMethod(); 
 
而要这样:
 
// Long running database call ... 
 
LargeObject largeObject = new LargeObject(); 
 
largeObject.MyMethod(); 
 
同样,这个原则也适用于消耗资源很多的对象,例如Transaction事务对象,要尽可能晚的打开事务,尽可能早的关闭事务。
 
2.  如果在.NET4 中,可以考虑使用Lazy<T>。它可以使得我们定义事先定义一个对象,知道需要的时候才实例化它。如下:
Lazy<ExpensiveObject> expensiveObject = new Lazy<ExpensiveObject>(); 
 
通过以下语句在需要时,获取这个对象:
 
expensiveObject.Value; 
 
 
3. 对于确定不再需要的对象,尽早的释放,将其引用设为null,如下:
LargeObject largeObject =  new LargeObject(); 
 
// Create reference from long lived object to new large object 
 
longLivedObject.largeObject = largeObject; 
 
// Reference no longer needed 
 
longLivedObject.largeObject =  null
 
常用优化措施
1. 使用StringBuilder进行字符串拼接
不要这样:
 
string s = ""; 
 
for ( int i = 0; i < stringArray.Length; i++) 

 
     s += stringArray[i]; 
 

要这样:
StringBuilder sb =  new StringBuilder(capacity); 
 
for ( int i = 0; i < stringArray.Length; i++) 

 
sb.Append(stringArray[i]); 
 

 
string s = sb.ToString(); 
 
不要这样:
 
// Concatenation results in new string object 
sb.Append(stringArray[i] +  ","); 
 
要这样:
 
sb.Append(stringArray[i]); 
sb.Append( ","); 
 
:
1.如果需要拼接的字符串超过了6个以上,那么就可以用StringBuilder,如果没有超过6个,那么可以直接将其拼接,两者区别不大。
2. 如果可以知道估算出字符串的长度,可以在使用StringBuilder拼接的时候,尽量的声明StringBuilder的容量,例如new StringBuilder(1000);因为如果不声明容量,StringBuilder的默认容量是16,如果字符串过长,那么CLR会重新为StringBuilder分配新的容量和内存,把原来的字符串copy过来,这样,原来的字符串保存空间就浪费,直到 CLR垃圾回收才释放。
2.使用Compare进行字符串的大小比较
比较字符串是否相等的时候,一般如下:
if (s1.ToLower() == s2.ToLower()) 

 

但是,这样会更好:
if ( string.Compare(s1, s2,  true) == 0) 

 

   因为在Compare方法比较的时候是一个字节一个字节的比较,这样会更快。
 
3.使用Response.Write来输出缓冲
ASP.NET中,采用Response.Write来讲数据发送到浏览器,
不要采用:
Response.Write(s1 + s2); 
要采用:
Response.Write(s1); 
Response.Write(s2); 
 
 


























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


 
 
相关文章
|
1月前
|
存储 算法 Java
Java内存管理深度剖析与优化策略####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,重点分析了堆内存的分配策略、垃圾回收算法以及如何通过调优提升应用性能。通过案例驱动的方式,揭示了常见内存泄漏的根源与解决策略,旨在为开发者提供实用的内存管理技巧,确保应用程序既高效又稳定地运行。 ####
|
1月前
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
71 31
|
29天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
86 7
|
29天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
55 5
|
1月前
|
大数据 C语言
C 语言动态内存分配 —— 灵活掌控内存资源
C语言动态内存分配使程序在运行时灵活管理内存资源,通过malloc、calloc、realloc和free等函数实现内存的申请与释放,提高内存使用效率,适应不同应用场景需求。
|
1月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
62 1
|
1天前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
51 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
84 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
61 0

热门文章

最新文章