`
xylw
  • 浏览: 57900 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
文章分类
社区版块
存档分类
最新评论

asp.net性能优化的几个方面

 
阅读更多

c#(或vb.net)程序改进 
1、使用值类型的ToString方法 

在连接字符串时,经常使用"+"号直接将数字添加到字符串中。这种方法虽然简单,也可以得到正确结果,但是由于涉及到不同的数据类型,数字需要通过装箱操作转化为引用类型才可以添加到字符串中。但是装箱操作对性能影响较大,因为在进行这类处理时,将在托管堆中分配一个新的对象,原有的值复制到新创建的对象中。 

使用值类型的ToString方法可以避免装箱操作,从而提高应用程序性能。 
int num=1; 
string str="go"+num.ToString(); 

2、运用StringBuilder类 

String类对象是不可改变的,对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象,其方法ToString对性能的提高并非很显著。 

在处理字符串时,最好使用StringBuilder类,其.NET 命名空间是System.Text。该类并非创建新的对象,而是通过Append,Remove,Insert等方法直接对字符串进行操作,通过ToString方法返回操作结果。 

其定义及操作语句如下所示: 
int num; 
System.Text.StringBuilder str = new System.Text.StringBuilder(); //创建字符串 
str.Append(num.ToString()); //添加数值num 
Response.Write(str.ToString); //显示操作结果 

3、使用 HttpServerUtility.Transfer 方法在同一应用程序的页面间重定向 
采用 Server.Transfer 语法,在页面中使用该方法可避免不必要的客户端重定向(Response.Redirect)。 


4、避免使用ArrayList。 
因为任何对象添加到ArrayList都要封箱为System.Object类型,从ArrayList取出数据时,要拆箱回实际的类型。建议使用自定义的集合类型代替ArrayList。asp.net 2.0提供了一个新的类型,叫泛型,这是一个强类型,使用泛型集合就可以避免了封箱和拆箱的发生,提高了性能。 
5、使用HashTale代替其他字典集合类型 
(如StringDictionary,NameValueCollection,HybridCollection),存放少量数据的时候可以使用HashTable. 
6、为字符串容器声明常量,不要直接把字符封装在双引号" "里面。 
//避免 
MyObject obj = new MyObject(); 
obj.Status = "ACTIVE"; 
//推荐 
const string C_STATUS = "ACTIVE"; 
MyObject obj = new MyObject(); 
obj.Status = C_STATUS; 
7、不要用ToUpper(),ToLower()转换字符串进行比较,用String.Compare代替,它可以忽略大小写进行比较. 
例: 
const string C_VALUE = "COMPARE"; 
if (String.Compare(sVariable, C_VALUE, true) == 0) 

Console.Write( "相同"); 

也可以用str == String.Empty或者str.Length == 0判断是否为空。(注意判断输入数据的长度,可防止sql注入式攻击) 
将String对象的Length属性与0比较是最快的方法,避免不必要的调用 ToUpper 或 ToLower 方法。 
8、类型转化Int32.TryParse()优于Int32.Parse()优于Convert.ToInt32()。 
建议.NET1.1下用Int32.Parse();.NET2.0用Int32.TryParse()。 
因为: 
Convert.ToInt32 会把最终的解析工作代理给 Int32.Parse; 
Int32.Parse 会把最终的解析工作代理给Number.ParseInt32; 
Int32.TryParse 会把最终的解析工作代理给Number.TryParseInt32。 
9、如果只是从XML对象读取数据,用只读的XPathDocument代替XMLDocument,可以提高性能 
//避免 
XmlDocument xmld = new XmlDocument(); 
xmld.LoadXml(sXML); 
txtName.Text = xmld.SelectSingleNode( "/packet/child").InnerText; 
//推荐 
XPathDocument xmldContext = new XPathDocument(new StringReader(oContext.Value)); 
XPathNavigator xnav = xmldContext.CreateNavigator(); 
XPathNodeIterator xpNodeIter = xnav.Select( "packet/child"); 
iCount = xpNodeIter.Count; 
xpNodeIter = xnav.SelectDescendants(XPathNodeType.Element, false); 
while(xpNodeIter.MoveNext()) 

sCurrValues += xpNodeIter.Current.Value+ ","; 


10、避免在循环体里声明变量,应该在循环体外声明变量,在循环体里初始化。 

C#程序开发要遵循的一个基本原则就是避免不必要的对象创建 

//避免 
for(int i=0; i <10; i++) 

SomeClass objSC = new SomeClass(); 

//推荐 
SomeClass objSC = null; 
for(int i=0; i <10; i++) 

objSC = new SomeClass(); 

11、捕获指定的异常,不要使用通用的System.Exception. 
//避免 
try 

<some logic> 

catch(Exception exc) 

<Error handling> 


//推荐 
try 

<some logic> 

catch(System.NullReferenceException exc) 

<Error handling> 

catch(System.ArgumentOutOfRangeException exc) 

<Error handling> 

catch(System.InvalidCastException exc) 

<Error handling> 

12、使用Try...catch...finally时, 要在finally里释放占用的资源如连接,文件流等 
不然在Catch到错误后占用的资源不能释放。 

try 
{} 
catch 
{} 
finally 

conntion.close(); 


13、不要用Exception控制程序流程 
有些程序员可能会使用异常来实现一些流程控制。例如: 
try{ 
result=100/num; 

Catch(Exception e) 

result=0; 

但实际上,Exception是非常消耗系统性能的。除非必要,不应当使用异常控制来实现程序流程。上面的代码应当写为: 
if(num!=0) 
result=100/num; 
else 
result=0; 

14、避免使用递归调用和嵌套循环,使用他们会严重影响性能,在不得不用的时候才使用。 

------------------------------------------------------------

StringJoiner 拯救那些性能低下的字符串拼装代码

 

StringJoiner

很简单,把 string s 改成 StringJoiner s 就大功告成。即

StringJoiner s = string.Empty;
s += "Bruce";
s += "Who?";
s += "a guy think sth different...";

 

咋这么简单就提高性能?忽悠我?

当然不是忽悠大家,也不是玩魔术,文章末会有性能测试数据,有图有真相。

现在让我来揭开 StringJoiner 的面纱,最后你肯定会说:原来这么简单。

StringJoiner 其实是类似装饰者模式,对外隐藏了StringBuilder ,就像魔术师喜欢把一堆道具藏到袖子,以忽悠观众那样。

public class StringJoiner 
{
    protected StringBuilder Builder;

    public StringJoiner()
    {
        Builder = new StringBuilder();
    }
}

(把Builder定义成protected ,期待某天可能需要继承StringJoiner 来继续“忽悠观众”)

StringJoiner 是怎么实现刚才的代码?

1.隐式转换

如:

StringJoiner s = string.Empty;

 

的谜底是:

public static implicit operator StringJoiner(string value)
{
    StringJoiner text = new StringJoiner();
    text.Builder.Append(value);
    return text;
}

(新建一个对象,把赋值转移到 StringBuilder 的Append方法)

 

2. 重载操作符

如:

s += "Bruce";

 

的谜底是:

public static StringJoiner operator +(StringJoiner self, string value)
{
    self.Builder.Append(value);
    return self;
}

(实现 StringJoinerstring 类型可以通过运算符“+”操作,同样是把字符串交给StringBuilder 的Append方法)

为了更通用,如实现与其他类型连接:

s += 123;
s += 0.314;
s += 'c';

 

因此,必须重载 StringJoiner + Object

public static StringJoiner operator +(StringJoiner self, object value)
{
    self.Builder.Append(value);
    return self;
}

 

最后,为了让 StringJoiner 的“忽悠”水平更上一层楼,StringJoiner 的对象必须能够隐式转换成 string 类型:

public static implicit operator string(StringJoiner value)
{
    return value.ToString();
}

public override string ToString()
{
    return this.Builder.ToString();
}

 

当然,到这一刻 StringJoiner 已经足够了,更彻底的“忽悠”并不是本文的目的。 StringJoiner 并不是想替代string,更不是替代StringBuilder,反而我举脚赞成使用StringBuilder。但如果你想重构一段由“string += ” 带来的惨不忍睹的代码时,用StringJoiner 吧。

分享到:
评论

相关推荐

    ASP.NET26个常用性能优化方法

    对于网站开发人员来说,在编写ASP.NET应用程序时注意性能问题,养成良好的习惯,提高应用程序性能,至少可以推迟必需的硬件升级,降低网站的成本。  访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些...

    ASP.NET网络在线考试系统(源代码+thesis).zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

    ASP.NET图书馆管理信息系统(源代码+thesis).zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

    ASP.NET中常用的优化性能方法详解

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接、打开连接和关闭连接几个操作。 这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源。 ASP.NET中提供了连接池...

    ASP.NET比较常用的26个性能优化技巧

    本篇文章主要介绍了”ASP.NET中常用的26个优化性能方法”,主要涉及到ASP.NET中常用的26个优化性能方法方面的内容,对于ASP.NET中常用的26个优化性能方法感兴趣的同学可以参考一下。  现在很多客户也慢慢开始注重...

    asp.net博客系统

    本博客采用ASP.NET2.0 c# + MSSQL2005 + XML + jquery + anthem.net开发,暂时为单用户版本,以下简单介绍... 程序基于类似petshop的标准三层架构,方便维护与扩展(不过暂时只支持MSSQL数据库-_-||) 前台使用...

    Asp.net 网站性能优化二则分享

    了解常见的网站性能优化技巧 首先我们要学一些优化网站性能和体验的理论和基础知识,雅虎已经帮我们总结好了,详见参考链接中的几篇文章,有好心人已经给翻译成中文了。这里面提到的一些技巧可操作性都很强,建议每...

    10.ASP.NET应用程序性能优化.pdf

    Q:STA 为什么比 MTA 运行效率低 ? A:举个例子:有一屋子的货物要在最短的...还是请几个朋友一起帮忙运快?通过这个例子我想可以说明STA和MTA的区别,当然还有很多值得注意的地方。建议去网上搜索一下详细的对比文章。

    asp.net通讯录管理系统课程设计.zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

    asp.net医药进销存系统.zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

    庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

    6.9 页面状态性能优化策略 238 6.9.1 存储位置优化——把视图状态信息保存在服务端而非客户端 238 6.9.2 体积优化——压缩视图状态数据 240 6.9.3 分块存储视图状态数据 243 6.10 视图状态和控件状态的总结 243 ...

    asp.net企业客户管理系统cms系统.zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

    asp.net+sql2008在线论坛系统.zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

    asp.net-sql2008公司人事管理系统.zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

    asp.net选课系统毕业设计全套参考资料.zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

    ASP.NET基于.NET的城市公交查询系统的设计与实现(源代码+thesis).zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

    ASP.NET一个简单的媒体播放器的设计与实现(源代码+thesis).zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

    asp.net学生信息系统(适合课程设计).zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

    ASP.NET-某企业信息管理系统的设计与实现(源代码+thesis).zip

    性能优化:我们将使用一系列性能优化技术来提高应用程序的性能。这包括使用高效的算法和数据结构、使用缓存技术和数据库索引、进行代码优化和资源管理等。 通过采用这些技术方案,我们的项目将能够提供一个高性能、...

Global site tag (gtag.js) - Google Analytics