.net中C#性能优化测试实现

今天,我想跟大家聊一聊C#的性能优化,当然,这里并不谈基本的原则,这些都假设你已经非常精通了,本文聊的是要争取几个毫秒的程序。关于基本的性能优化,可以参考园子里的文章。比如:

.NET 性能优化方法总结

先说说我的测试环境:

一台典型的笔记本电脑,Windows 7中文版,.net Framework用的是4.5版本,VS是现在VS11 beta版。我也是用VS2008这样的环境测试了下面的所有场景,发现没有任何区别,所以就以VS11为基准了。

所有测试数据都是编译为Relase,且不包含PDB,直接双击运行而非在VS环境下执行。点击这里下载源代码。

言归正传,先测试第一点:

 

静态方法比实例方法快吗?
我们总是从各个渠道听说:静态方法比实例方法要快,所以,我想亲自试试。测试方法很简单,循环调用实例方法和静态方法。

?/// <summary>
/// 这是一个普通类,调用实例的方法
/// </summary>
public class C1 {
    public void DoLoop() {
        for (int i = 0; i < int.MaxValue; i++) {
            DoIt();
        } 
    }
 
    private void DoIt() {
    }
}
 
/// <summary>
/// 使用静态方法调用。
/// </summary>
public static class C2 {
    public static void DoLoop() {
        for (int i = 0; i < int.MaxValue; i++) {
            DoIt();
        }
    }
 
    private static void DoIt() {
    }
}

测试结果如下:

 

测试多次,基本偏差不大,只能说,静态方法比实例方法快那么可怜的一点点,鉴于实例方法的灵活性远大于静态方法,所以还是一般使用实例方法吧。

也实验过,在方法中访问实例字段和静态字段,发现也没有区别,所以不再单独罗列代码。

 

避免方法内创建实例的情况
这个要讨论的问题有点难说明,我们还是先看一看.net内部的代码吧,下面是一段Collection<T>.Add的方法:

?1
2
3
4
5
6
7
8
9 public void Add(T item)
{
    if (this.items.IsReadOnly)
    {
        ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
    }
    int count = this.items.Count;
    this.InsertItem(count, item);
}

注意ThrowHelper类,如果换成我们自己写,一句话就搞定了:throw new NotSupportedException。为什么微软要这么写呢?

老外有解释:Why does SortedList implementation use ThrowHelper instead of throwing directly?

其实,我也是信奉此真理,而且就在前一段时间,一位同事还找我问,两段几乎一样的代码,为什么测试性能有差距,结果我按照此原理,将异常抛出放在外面,结果真的变好了。

现在,我还要再次测试一下,我相信的是数据:

?class C1 {
    private Dictionary<int, int> _dict = new Dictionary<int, int>() ;
    public C1() {
        _dict.Add(1, 1);
        _dict.Add(2, 2);
    }
 
    public void Do1() {
        object obj = new object();
        for (int i = 0; i < int.MaxValue/100; i++) {
            GetItOne(1);
        }
    }
 
    //这个方法,在内部可能创建实例
    private int GetItOne(int key) {
        int value;
        if (!_dict.TryGetValue(key,out value)) {
            throw new ArgumentOutOfRangeException("key");
        }
        return value;
    }
 
    public void Do2() {
        for (int i = 0; i < int.MaxValue/100; i++) {
            GetItTwo(1);
        }
    }
 
    //这个方法,将创建实例的代码移动到外部
    private int GetItTwo(int key) {
        int value;
        if (!_dict.TryGetValue(key, out value)) {
            ThrowArgumentOutOfRangeException();
        }
        return value;
    }
 
    private static void ThrowArgumentOutOfRangeException() {
        throw new ArgumentOutOfRangeException("key");
    }
}

测试结果是:

基本上,会快0.06秒左右,但是如此大的循环得到的好处并不是那么的明显,但有作用。这种写法还是比较舒服的,所以还是建议大家用吧。

时间: 2024-09-22 01:17:32

.net中C#性能优化测试实现的相关文章

Android中SparseArray性能优化的使用方法_Android

之前一篇文章研究完横向二级菜单,发现其中使用了SparseArray去替换HashMap的使用.于是乎自己查了一些相关资料,自己同时对性能进行了一些测试.首先先说一下SparseArray的原理.   SparseArray(稀疏数组).他是Android内部特有的api,标准的jdk是没有这个类的.在Android内部用来替代HashMap<Integer,E>这种形式,使用SparseArray更加节省内存空间的使用,SparseArray也是以key和value对数据进行保存的.使用的时

技巧:ASP.NET设计中的性能优化问题

asp.net|技巧|设计|问题|性能|优化 一.SqlDataRead和Dataset的选择 Sqldataread优点:读取数据非常快.如果对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多.缺点:直到数据读完才可close掉于数据库的连接 (SqlDataReader 读数据是快速向前的.SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法.它使用 SQL Server 的本机网络数据传输格式从

ASP.NET设计中的性能优化问题

asp.net|设计|问题|性能|优化 一.SqlDataRead和Dataset的选择 Sqldataread优点:读取数据非常快.如果对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多.缺点:直到数据读完才可close掉于数据库的连接 (SqlDataReader 读数据是快速向前的.SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法.它使用 SQL Server 的本机网络数据传输格式从数据库

Wins2003系统中Apache性能优化方法_win服务器

为了满足网站高负荷的要求,在调整Apache参数时发现进程经常占用内存过多导致当机.经过不断的优化和修改参数组合,终于让服务器稳定 下来,可以满足大量访问的考验和应用要求.笔者总结了调试过程中的问题和解决办法如下,以供有类似需求的网管员参考(系统环境为Windows Server 2003和apache2.2.8): 1.http-mpm.conf设置 Apache的线程数控制文件为http-mpm.conf,在conf/exrtra目录下面,要使该配置文件起作用需要在httpd.conf 中将

Windwos2003系统中Apache性能优化

为了满足网站高负荷的要求,在调整Apache参数时发现进程经常占用内存过多导致当机.经过不断的优化和修改参数组合,终于让服务器稳定 下来,可以满足大量访问的考验和应用要求.笔者总结了调试过程中的问题和解决办法如下,以供有类似需求的网管员参考(系统环境为Windows Server 2003和apache2.2.8): 1.http-mpm.conf设置 Apache的线程数控制文件为http-mpm.conf,在conf/exrtra目录下面,要使该配置文件起作用需要在httpd.conf 中将

从C#垃圾回收(GC)机制中挖掘性能优化方案

GC,Garbage Collect,中文意思就是垃圾回收,指的是系统中的内存的分配和回收管理.其对系统性能的影响是不可小觑的.今天就来说一下关于GC优化的东西,这里并不着重说概念和理论,主要说一些实用的东西.关于概念和理论这里只做简单说明,具体的大家可以看微软官方文档. 一.什么是GC                                                                                              GC如其名,就是垃圾收集

Android中SparseArray性能优化的使用方法

之前一篇文章研究完横向二级菜单,发现其中使用了SparseArray去替换HashMap的使用.于是乎自己查了一些相关资料,自己同时对性能进行了一些测试.首先先说一下SparseArray的原理. SparseArray(稀疏数组).他是Android内部特有的api,标准的jdk是没有这个类的.在Android内部用来替代HashMap<Integer,E>这种形式,使用SparseArray更加节省内存空间的使用,SparseArray也是以key和value对数据进行保存的.使用的时候只

漫谈ASP.NET设计中的性能优化问题

一.SqlDataRead和Dataset的选择 Sqldataread优点:读取数据非常快.如果对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多.缺点:直到数据读完才可close掉于数据库的连接 (SqlDataReader 读数据是快速向前的.SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法.它使用 SQL Server 的本机网络数据传输格式从数据库连接直接读取数据.DataReader需

Java中String性能优化_java

不用使用String的构造函数,可能的话直接使用字符串. 两个特例: 1)想把char []转换为一个String, 2) 使用一个大的String对象的substring()方法: String.equals() 比 String.equalsIgnoreCase()要快: 尽量使用StringBuilder来构造一个String,而不是"+"操作符和String.concat() (除非是一个表达式,String s = a + b + c): StringBuilder是不同步的