代码性能优化综合方案

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

定位:

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

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
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值