构建高性能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  ,如需转载请自行联系原作者


 
 
相关文章
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
552 10
|
4月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
10月前
|
前端开发 C# 开发者
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
127 12
|
10月前
|
弹性计算 开发框架 安全
基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发
本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
|
11月前
|
Kubernetes Cloud Native Ubuntu
庆祝 .NET 9 正式版发布与 Dapr 从 CNCF 毕业:构建高效云原生应用的最佳实践
2024年11月13日,.NET 9 正式版发布,Dapr 从 CNCF 毕业,标志着云原生技术的成熟。本文介绍如何使用 .NET 9 Aspire、Dapr 1.14.4、Kubernetes 1.31.0/Containerd 1.7.14、Ubuntu Server 24.04 LTS 和 Podman 5.3.0-rc3 构建高效、可靠的云原生应用。涵盖环境准备、应用开发、Dapr 集成、容器化和 Kubernetes 部署等内容。
579 6
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
827 0
|
Java Spring 自然语言处理
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
135 0
|
10月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
237 5
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
386 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
200 7