《软件开发性能优化系列》之类型系统

1、 避免无意义的变量初始化动作

      CLR保证所有对象在访问前已初始化,其做法是将分配的内存清零。因此,不需要将变量重新初始化为0、false或null。

 

//Generally expert 10 or less items
private HashTable _items = null;
private NameValueCollection = _queryString = null;
private string _siteUrl = null;
private Uri _currentUri;
string rolesCacheKey = null;
string authenticationType = "forms";
bool  _isUrlRewritten = false;
string _rawUrl = null;

HttpContext _httpContext = null
DateTime requestStarTime = DateTime.Now;


      需要注意的是:方法中的局部变量不是从堆而是从栈上分配,所以C#不会做清零工作。如果使用了未赋值的局部变量,编译期间即会报警。不要因为有这个印象而对所有类的成员变量也做赋值动作,两者的机理完全不同!

 
2、 ValueType 和 ReferenceType

 

(1)、 以引用方式传递值类型参数


值类型从调用栈分配,引用类型从托管堆分配。当值类型用作方法参数时,默认会进行参数值复制,这抵消了值类型分配效率上的优势。作为一项基本技巧,以引用方式传递值类型参数可以提高性能。

private void UseDateByRef(ref DateTime dt){ }
public void foo()
{
      DateTime now = DateTime.Now;
      UseDateByRef(ref now);
}


 
(2)、 为 ValueType 提供 Equals 方法

 
      .net 默认实现的 ValueType.Equals 方法使用了反射技术,依靠反射来获得所有成员变量值做比较,这个效率极低。如果我们编写的值对象其 Equals 方法要被用到(例如将值对象放到 HashTable 中),那么就应该重载 Equals 方法。

public struct Rectangle 
{ 
   public double Length; 
   public double Breadth; 
   public override bool Equals ( object ob) 
   { 
      if (ob is Rectangle) 
         return Equels ((Rectangle)ob)) 
      else 
         return false ; 
   } 
   private bool Equals (Rectangle rect) 
   { 
       return this .Length == rect.Length && this .Breadth == rect.Breach; 
   } 
} 


(3)、避免装箱和拆箱 


      C#可以在值类型和引用类型之间自动转换,方法是装箱和拆箱。装箱需要从堆上分配对象并拷贝值,有一定性能消耗。如果这一过程发生在循环中或是作为底层方法被频繁调用,则应该警惕累计的效应。
一种经常的情形出现在使用集合类型时。例如:

ArrayList al = new ArrayList(); 
for ( int i = 0 ; i < 1000 ; i ++ ) 
{ 
al.Add(i); // Implicitly boxed because Add() takes an object 
} 
int f = ( int )al[ 0 ]; // The element is unboxed 


 

     解决这个问题的方法是使用.net2.0支持的泛型集合类型。

posted @   JoneLee  阅读(1930)  评论(3编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
http://s.click.taobao.com/t_9?p=mm_33531378_0_0&l=http%3A%2F%2Fwww.tmall.com%2Fgo%2Fact%2Fsale%2Ftmmytkpd.php%E8%81%BD
点击右上角即可分享
微信分享提示