高效C#编码优化
1.foreach VS for 语句
Foreach 要比for具有更好的执行效率
Foreach的平均花费时间只有for的30%.通过测试结果在for和foreach都可以使用的情况下,我们推荐使用效率更高的foreach
另外,用for写入数据时间大约是读取数据时间的10倍左右.
2.避免使用ArrayList
ArrayList的性能低下任何对象添加到ArrayList中都要封箱为System.Object,从ArrayList中取出数据都要拆箱回实际的类型
泛型集合类的高性能,泛型集合是强类型的
3.使用HashTable字典集合
当存放少量数据时建议使用HashTable取代像StringDictionary,NameValueCollection, HybridCollection这样的字典集合
4.为字符串容器声明常量
为字符串容器声明常量,不要直接把字符串封装在双引号””中,避免字符串对象不断在内存中创建和释放.提高字符串对象的访问效率.
//避免
MyObject obj = new MyObject();
obj.Status = “Active”;
//推荐
const string c = “Acive”;
MyObject obj = new MyObject();
obj.Status = c;
5.使用String.Compare()字符串比较
不要使用UpperCase或LowerCase转换字符串的大小写,再进行比较
使用String.Compare()可忽略字符串大小写进行比较
String strTemp = “Active”;
If(String.Compare(strTemp,”active”,true)==0){
Consolt.Write(“Equal”);
}
6.使用StringBuilder字符串拼接
1.String类对象是不可变的(只读),对于String对象的重新赋值,本质是重新创建一个新的String对象并赋予新值给该对象.
2.System.Text.StringBuilder 维护一个长度等于Capacity的字符串(可以看作字符数组),当Capacity长度的字符串不足以容纳结果字符串时,StringBuilder开辟新的长度为经过上面的规则计算好的Capacity的内存区域,将原字符串复制到新的内存区域再进行操作,原字符串区域交给GC回收。因此这里也涉及到内存的分配与回收,使用StringBuilder时最好估算一下所需容量,用这个容量初始化Capacity,提高性能。StringBuilder不能保证所有实例成员都是线程安全的,尽管在类型定义中加入了很多线程安全的控制,如果要确保其线程安全,须手工实现线程同步机制。
7.XPathDocument读取XML文件
如果只是读取XML对象的数据,那么用只读的XPathDocument代替XMLDocument,可以提高性能
8.避免在循环体里声明变量,应该在循环体外声明变量,在循环体内初始化变量
//避免
For(int i=0;i<10;i++){
SomeClass obj = new SomeClass();
//…
}
//推荐
SomeClass obj = null;
For(int i=0; i<10; i++){
obj = new SomeClass();
//…
}
9.捕获指定的异常
捕获异常时,应使用具体的异常类进行捕获,并按照异常所捕获得范围按照由小到大的顺序进行定义不要使用通用的System.Exception
Private void Find(object obj){
try{
Console.write(obj.ToString());
}
catch(ArgumentNullException ane)
{ //… }
catch(ArgumentException ae)
{ //… }
catch(SystemException se)
{ //… }
catch(Exception e)
{ //… }
}
不要使用Exception控制流程,捕获异常对性能的损耗是众所周知的.因此最好能够避免异常的发生
10.使用using和try/finally清理资源
.NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源
使用非托管资源的类型必须实现IDisposable接口的Dispose方法来精确的释放资料
当使用带有Dispose方法的类型化资源时,应在使用完毕时调用Dispose方法,及时释放掉不用的资源.
使用using或try/finally能更好的保证Dispose方法被及时的调用
11.避免滥用反射
反射是比较浪费性能的操作,应避免滥用反射
影响性能的原因:
当使用反射来调用类型或触发方法,访问字段属性时,CLR需要做更多的工作:校验参数,检查权限等.
当编写一个动态构造类型(晚绑定)的应用时,可采取以下方式进行替换
通过类的继承关系
通过接口实现
通过委托实现
12.避免装箱操作
使用值类型的ToString方法避免装箱操作
原因:数字和字符串拼接的时候,因为数据类型不同,数字通过装箱操作转换为引用类型后才能与字符串进行拼接.
//建议
int num=5;
string str = “link me”+num.ToString();
13.HttpServerUtility.Transfer
采用 Server.Transfer 语法,在页面中使用该方法可避免不必要的客户端重定向(Response.Redirect)。
Int32.TryParse()
类型转化Int32.TryParse()优于Int32.Parse()优于Convert.ToInt32()
Convert.ToInt32 会把最终的解析工作代理给Int32.Parse
Int32.Parse 会把最终的解析工作代理给Number.ParseInt32
Int32.TryParse 会把最终的解析工作代理给Number.TryParseInt32
高效C#编码优化的更多相关文章
- 网站的性能优化与安全(高效C#编码优化)
1. Foreach 比 For 性能高30%2. 避免是使用ArrayList, 因为任何对象到ArrayList都有封装为Object,出来还要拆箱. 用泛型去掉3. HashTalbe取代 ...
- Android最佳性能实践(三)——高性能编码优化
在前两篇文章当中,我们主要学习了Android内存方面的相关知识,包括如何合理地使用内存,以及当发生内存泄露时如何定位出问题的原因.那么关于内存的知识就讨论到这里,今天开始我们将学习一些性能编码优化的 ...
- Java编码优化
Java编码优化 1.尽可能使用局部变量 调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变 量,如静态变量.实例变量等,都在堆中创建,速度较慢.另外,栈中创建的变量,随 着方 ...
- 高效JQuery编码
缓存变量 DOM遍历是昂贵的,所以尽量将会重用的元素缓存. // 糟糕 h = $('#element').height(); $('#element').css('height',h-20); ...
- 【翻译】Ext JS——高效的编码风格指南
原文:ExtJS - Efficient coding style guide 作者:Raja 切勿使用"new"关键字:在Ext JS中,使用"new"关键字 ...
- SQL挑战——如何高效生成编码
有这样一个需求:需要根据输入的编码(这个编码值来自于数据库的一个表)生成下一个编码,编码规则如下所示(我们暂且不关心这个逻辑是否合理,只关心如何实现): 1: 最小值为A0000, 最大值为ZZZZZ ...
- C++编码优化之减少冗余拷贝或赋值
临时变量 目前遇到的一些产生临时变量的情况:函数实参.函数返回值.隐式类型转换.多余的拷贝 1. 函数实参 这点应该比较容易理解,函数参数,如果是实参传递的话,函数体里的修改并不会影响调用时传入的参数 ...
- Android bitmap高效显示和优化
第一部分:Bitmap高效显示 应用场景:有时候我们想在界面上显示一个网络图片或者显示一张本地的图片,但是图片本身是很大的有几兆,但是显示的位置很小或者说我们可以用更小的图片来满足这样的需求,如果把整 ...
- String当中的高效函数(优化)
1. indexOf()函数是一个执行速度非常快的函数,可以用其与subString()实现高效的字符串分割,比内置的要高效. 2. charAt()方法也是高效率的函数,可以用其实现高效的start ...
随机推荐
- Windows命令行乱码问题解决
命令 chcp功能: 显示或设置活动代码页编号 CHCP [nnn] nnn 指定代码页编号. 不加参数键入 CHCP 显示活动代码页编号. nnn指定一已有的系统字符集,该字符集在CONFIG.SY ...
- LCN协调者服务集群
官方文档: https://github.com/codingapi/tx-lcn/wiki/TxManager%E9%9B%86%E7%BE%A4%E8%AF%B4%E6%98%8E 核心原理 通过 ...
- 【codevs2333】&【BZOJ2002】弹飞绵羊[HNOI2010](分块)
我其实是在codevs上看到它的题号后才去做这道题的...2333... 题目传送门:codevs:http://codevs.cn/problem/2333/ bzoj:http://www.lyd ...
- UvaLive 5811 概率DP
题意 : 有54张牌 问抽多少张牌能使每种花色都至少是给定的数字 两张王牌可以被选择为任何花色 高放学长真是太腻害辣! 设置dp[][][][][x][y] 前四维代表四种真的花色的数量 后两维xy代 ...
- (转)Openstack Cascading和Nova Cell
Openstack是看着AWS成长起来的,这点毋庸置疑:所以AWS大规模商用已成事实的情况下,Openstack也需要从架构和产品实现上进行优化,以满足大规模商用的要求.从已有的实现来看其中两种方式值 ...
- Model compatibility cannot be checked because the database does not contain model metadata. Ensure that IncludeMetadataConvention has been added to the DbModelBuilder conventions
Model compatibility cannot be checked because the database does not contain model metadata. Ensure t ...
- Lucene.Net 优化索引生成,即搜索显示优化
最近发现站内搜索引擎响应速度很慢,因为刚来公司之前技术员跑了源码什么的都没留下.只好自己手动破解源代码dll查找问题所在! 这个问题代码就暂时不贴了这里只写思路 原逻辑:经过整体分析后发现之前是使用 ...
- python--pycharm汉化
一.准备工具 1.pycharm软件 2.汉化包 二.解压汉化包 三.将resources_cn.jar复制到pycharm文件中lib目录下 四.重新打开pycharm
- mysql 数据备份及pymysql模块
一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...
- Spring_总结_03_装配Bean(一)_自动装配
一.前言 本文承接上一节:Spring_总结_02_依赖注入 在上一节我们了解到依赖注入的实质就是装配. 这一节我们来学习下装配Bean的相关知识. 二.Bean的装配机制 1.三种装配机制 Spri ...