代码性能优化综合方案

来源:互联网 发布:淘宝网地板腊 编辑:程序博客网 时间:2024/06/08 10:30

我们常常遇到性能方面的问题。功能实现了,但是性能超级不给力。今天
我们来一起聊一聊这个老大难的问题。

定位:

首先,我们需要做的是定位。不断的缩小范围,准确的定位出问题到底是 出在了哪个环节。这个过程我们可以通过一些软件来测试出,或是打印时间来看一下。
例如:

Stopwatch stopWatch = new Stopwatch();        stopWatch.Start();        Thread.Sleep(10000);        stopWatch.Stop();        TimeSpan ts = stopWatch.Elapsed;        // 格式化显示时间        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",            ts.Hours, ts.Minutes, ts.Seconds,            ts.Milliseconds / 10);        Console.WriteLine("RunTime " + elapsedTime);watch.ElapsedMilliseconds.ToString()

或如:

Console.WriteLine("查询数据前时间是:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));

通过这样就能看见时间大部分都花在了哪里。
接下来就是怎么优化,小编 有几个这样的优化方向。

优化方向

1)优化系统结构

2)添加缓存

    缓存(Cache)是性能优化中最常用的手段,针对需要频繁的获取一些    数据,同时每次获取数据需要的时间比较长的场景。如果使用了缓存的    优化方法,需要特别注意缓存数据的同步:如果真实的数据发生了变    化,应该及时的清除缓存数据,确保不会因为缓存而使用了错误的数据。

关于此,小编详细的写过两篇博客, 有兴趣的可以 移步。
性能优化之读写分离一
性能优化之读写分离二

3 算法

    对于某些功能的实现,选择合适的数据结构能够更加方便的存储和查找    数据。灵活的应用字典,集合或自定义等存取。看 看保存什么样的直    接或间接数据更加合适。也看看自己是读的多还是写的多,根据这些特    点来 采取不同的方式。

4 细节方面

  • 垃圾回收

    .NET Framework垃圾回收的成本高,每次回收垃圾的时候调用最久
    未被使用的算法,找出最久未被使用的对象然后把这个对象分配的内存进行回收。进行这样的算法会非常消耗计算机的运算能力,所以在C#程序编码中避免创建不必要的对象。

    1.1避免在循环中创建对象
    高效的做法是将对象的创建置于循环之外。但是如果每一次循环需要
    实例化一个对象加入到对象列表中这个就避免不了在循环内部创建
    列表中的对象是循环最后一次对象的数据了。

    1.2在需要的地方才创建对象
    如果对象只有在某些分支逻辑中才会被使用到,那么把具体创建对象
    的操作放在逻辑分支中。尽量避免在函数之前创建出函数所要使用到
    的所有对象。

  • 2语句

    2.1foreach VS for 语句
    Foreach 要比for具有更好的执行效率Foreach的平均花费时间只有for的
    30%.通过测试结果在for和foreach都可以使用的情况下,我们推荐使用效
    率更高的foreach另外,用for写入数据时间大约是读取数据时间的10倍左
    右.

    2.2 使用using和try/finally
    使用using和try/finally清理资源.NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源 使用非托管资源的类型必须实现IDisposable接口的Dispose方法来精确的释放资料当使用带有Dispose方法的类型化资源时,应在使用完 毕时调用Dispose方法,及时释放掉不用的资源.使用using或try/finally能更好的保证Dispose方法被及时的调用

    2.3 String操作

    String字符串操作,我们多次使用到的。所以在操作String的时候采用不高效的处理会一定程度上影响到程序的执行效率。

    String是不变类,如果我们使用“+”来连接字符串,会导致创建一个新的空间来存储连接后的字符串,在多次循环中使用“+”会导致内存循环被开辟。这个时候应该使用StringBuilder。StringBuilder内部有一个StringBuffer,连接操作不会每一次都分配新的字符串空间。

  • 3 线程同步

    3.1 线程同步粒度
    C#线程同步通过Lock锁定对象,我们可以锁定一个方法,也可以锁定方法中的某一段代码。通常情况下,应该减小同步的范围,使系统获得更好的性能。

    3.2 同步策略
    使用lock锁定对象应该注意一下两点

    第一、避免使用锁定this,程序中this表示当前对象,锁定了改对象实例会影响其他使用到该示例的方法。

    第二、建议,如果要同步,找到需要锁定的最小范围,然后实例化一个object对象,该对象只为了实现同步的目的。

  • 4 异常处理

    4.1 程序中该抛出异常的地方一定要跑出异常,使用try….catch…模块包裹,这与性能无关,但是与程序排错非常必要。

    4.2 程序在抛出异常和捕获异常会消耗比较大的操作,在程序编写的情况下,通过完善程序逻辑尽量避免抛出可以考虑到的 逻辑漏洞。这样能提高程序的处理性能。

总结

通过一篇博客,小编总结了 一下最近的代码优化心得。到了这个环节,真的是细节决定成败。多多留意问题,发现问题。再定位和发现问题之后再进行调优。

0 0
原创粉丝点击