改善ASP.NET2.0性能的五件法宝
大多数ASP.NET程序员都会遇到这样的问题,当我们的web程序开发周期快要结束的时候,却发现还有很多性能方面的问题需要解决。如果您遇到这样的情况,那真是太糟糕了。也许每一个开发人员在开发Web程序时都会制定一个目标,如使用适当的内存以及如何处理Web请求等。虽然这些目标已经制定,但可能仍然会因为使用某些错误的方法来改善应用程序的性能而使事情变得更糟糕。因此,在本文中将给出了五个步骤来优化ASP.NET2.0应用程序,希望这些要点会给读者以启迪,以便使广大的开发人员不会走弯路。
1. 适当地处理数据访问对象
如果我们没有正确处理数据访问对象,就会大量消耗我们的服务器内存。当建立一个数据访问对象时,充分理解它们的生命周期以及不需要它们时如何处置是非常必要的。我经常看到很多开发人员建立、打开和销毁DataReader对象,但却不对它做任何处理。如果能确保我们的数据访问对象适当地被管理,这将在很大程度上解决IIS为什么直接机器快崩溃时才释放内存的另人头痛的问题。就先让我们在解决方案中查找关于DataReader实例吧,对于发现的每一个DataReader实例,请确保它们已经被关闭或是被释放。建议使用try/catch/finally块来处理。如下面代码所示:
using (IDataReader reader = MySite.GetSearchResults())
{
//Consume the datareader
while (reader.Read())
{
//Do something with the data
}
)
使用try/catch/finally 块
IDataReader reader;
try
{
reader = MyWeb.GetSearchResults();
while (reader.Read())
{
//Do something with the data
}
}
catch (Exception ex)
{
//Log the exception
}
finally
{
//如果这个对象存在,dispose这个对象
if (reader != null)
reader.Dispose();
}
2. 管理IIS应用程序池
在典型的应用中,当处理一个Web应用程序时,这个Web程序由多个部分组成。通常有我们的主Web站点,一个或多个Web服务,或是一个图象处理程序。IIS6为我们提供了为多个应用程序建立程序池的机会。应用程序池允许我们使应用程序在各自的单独进程中运行。这么做的好处是将我们的应用程序的不同组成部分分开,使它们分别运行在自己的内存空间中。由于每个处理进程的内存达到800-900M时系统就会变得很慢,因此,需要应用程序分散到不同的处理进程中,这样每个工作进程占有的内存就不会那么大了。这样会从某种程度上提高系统运行的效率。关于如果建立应用程序池的问题,请参阅微软的相关技术文档。
3. 管理ASP.NET状态
为了更进一步地改善应用程序性能,对ASP.NET的不同的状态类型有一个深入的了解是非常必要的。ASP.Net有许多不同的状态,但是我们应该弄清楚什么是应用程序状态、会话状态和profile属性。因为这些状态都保存在服务器的内存上。所有应尽量避免保存太多这三种状态的数据,除非有必要保存它们。如果我们需要在会话状态保存数据,就只存我们需要的数据,如标识字段或静态数据频繁被使用,因此,它们可以保存在会话状态中。现在网上有很多关于介绍ASP.NET这三种状态的文章,如果读者想更进一步发觉它们的潜力,可以阅读相关的资料。每一种状态都应该被使用在适合它们的地方。因此,花时间学习和理解它们是非常必要的。
在这里我想给读者介绍另外一种状态,视图状态,这种状态将会影响客户端程序。这种状态被用来在aspx页中保存数据,或是在服务端和客户端之间传递数据。在默认情况下,视图状态对于ASP.NET和控件是开启的。但我们的Web页并不是都需要视图状态。如果都开启,在Web页中将会有非常多的数据保存在视图状态中。解决这个问题的一个正确方法就是使用“View Source"来控制我们的Web页哪块数据需要被存储。我们可以看看ASP.NET发送客户端的数据,在页的上端一大块被加密的数据就是视图状态。花一些时间来确定哪些数据需要视图状态的值得的。如果某些Web页和服务端没有任何数据交互,可以将这些页的视图状态关闭。视图状态很灵活,它可以关闭整个页,也可以只关闭被个用户控件,或是只打开某些控件的视图状态。如果我们关闭某个页面或控件的视图状态,其它的页面或控件可以保证正确的工作状态。
4. 清除不需要的CSS和脚本文件
一个快速和容易的改善我们的应用程序性能的方法就是清楚我们程序中的不需要的CSS和脚本文件。有时我们的程序中存在很多旧的CSS,而且在开发程序时,在不断完善系统的过程中,可能会遗留很多没用的脚本文件或脚本程序。需要网站使用了一个单独的CSS或脚本文件来满足整个网站的需要。这样做将会产生大量的数据和代码冗余。有时,只要简单地清楚这些文件,就可以通过改变Web页的大小的方式来改善我们网站的性能。如果我们在网站的代码中继续引用不再使用的CSS或脚本文件,那么在每次加载网页时它们都会进行被传输,这样将是对网络资源的一种浪费。我们可以通过运行一个Web页分析器来准确地知道哪个页被转载,哪个页装载的时间最长。
5. 装载测试和Visual Studio Team系统
装载测试从本质上说是发现系统的性能问题,并测量系统在单位时间内的响应次数。Visual Studio Team系统(VSTS)包括了一个强大的简单的工具,用来对Web程序进行装载测试,并提供更有价值的报告。使用测试模板可以非常简单地按着系统所提示的步骤建立一个测试工程。我们可建立一个或多个Web测试,并为每一个Web测试配置相应的属性来模拟不同的用户。
通过使用VSTS提供的Web页记录器,可以纪录我们为了建立Web测试而在我们的网站中执行的一系列步骤。Web测试通过模拟的用户进行测试,这将作为装载测试的一部分。我们还可以使用性能监视器在我们的服务器上安装性能计数器。使用性能计数器监测我们的Web服务器上发生的一些特殊活动数据,如私有字节、虚拟字节以及CPU使用率等。如果我们在应用程序中有内存漏洞,那么我们很容易通过监视内存来发现这些漏洞。我们所得到的结果将以来于应用程序装载什么而有细微的差别,但是我们的Web服务器的内存应该达到一个一致的水平,并保持稳定。图1显示了一个VSTS装载测试的例子。
6、总结
上面所提到的五个用于改善Web性能的方法非常快捷,并不需要更多的开发经验和工作技巧。然而,如果我们决定采用这些步骤来处理我们的Web应用程序时,请对它们做一个仔细的分析,并研究每一个方面以便做出个正确的决定来如何优化。最好的方法是在进行开发之前做一个详尽的结构图和计划书。最后希望读者可以从本文找到用于改善自己的Web程序性能有用的方法。
1. 适当地处理数据访问对象
如果我们没有正确处理数据访问对象,就会大量消耗我们的服务器内存。当建立一个数据访问对象时,充分理解它们的生命周期以及不需要它们时如何处置是非常必要的。我经常看到很多开发人员建立、打开和销毁DataReader对象,但却不对它做任何处理。如果能确保我们的数据访问对象适当地被管理,这将在很大程度上解决IIS为什么直接机器快崩溃时才释放内存的另人头痛的问题。就先让我们在解决方案中查找关于DataReader实例吧,对于发现的每一个DataReader实例,请确保它们已经被关闭或是被释放。建议使用try/catch/finally块来处理。如下面代码所示:
using (IDataReader reader = MySite.GetSearchResults())
{
//Consume the datareader
while (reader.Read())
{
//Do something with the data
}
)
使用try/catch/finally 块
IDataReader reader;
try
{
reader = MyWeb.GetSearchResults();
while (reader.Read())
{
//Do something with the data
}
}
catch (Exception ex)
{
//Log the exception
}
finally
{
//如果这个对象存在,dispose这个对象
if (reader != null)
reader.Dispose();
}
2. 管理IIS应用程序池
在典型的应用中,当处理一个Web应用程序时,这个Web程序由多个部分组成。通常有我们的主Web站点,一个或多个Web服务,或是一个图象处理程序。IIS6为我们提供了为多个应用程序建立程序池的机会。应用程序池允许我们使应用程序在各自的单独进程中运行。这么做的好处是将我们的应用程序的不同组成部分分开,使它们分别运行在自己的内存空间中。由于每个处理进程的内存达到800-900M时系统就会变得很慢,因此,需要应用程序分散到不同的处理进程中,这样每个工作进程占有的内存就不会那么大了。这样会从某种程度上提高系统运行的效率。关于如果建立应用程序池的问题,请参阅微软的相关技术文档。
3. 管理ASP.NET状态
为了更进一步地改善应用程序性能,对ASP.NET的不同的状态类型有一个深入的了解是非常必要的。ASP.Net有许多不同的状态,但是我们应该弄清楚什么是应用程序状态、会话状态和profile属性。因为这些状态都保存在服务器的内存上。所有应尽量避免保存太多这三种状态的数据,除非有必要保存它们。如果我们需要在会话状态保存数据,就只存我们需要的数据,如标识字段或静态数据频繁被使用,因此,它们可以保存在会话状态中。现在网上有很多关于介绍ASP.NET这三种状态的文章,如果读者想更进一步发觉它们的潜力,可以阅读相关的资料。每一种状态都应该被使用在适合它们的地方。因此,花时间学习和理解它们是非常必要的。
在这里我想给读者介绍另外一种状态,视图状态,这种状态将会影响客户端程序。这种状态被用来在aspx页中保存数据,或是在服务端和客户端之间传递数据。在默认情况下,视图状态对于ASP.NET和控件是开启的。但我们的Web页并不是都需要视图状态。如果都开启,在Web页中将会有非常多的数据保存在视图状态中。解决这个问题的一个正确方法就是使用“View Source"来控制我们的Web页哪块数据需要被存储。我们可以看看ASP.NET发送客户端的数据,在页的上端一大块被加密的数据就是视图状态。花一些时间来确定哪些数据需要视图状态的值得的。如果某些Web页和服务端没有任何数据交互,可以将这些页的视图状态关闭。视图状态很灵活,它可以关闭整个页,也可以只关闭被个用户控件,或是只打开某些控件的视图状态。如果我们关闭某个页面或控件的视图状态,其它的页面或控件可以保证正确的工作状态。
4. 清除不需要的CSS和脚本文件
一个快速和容易的改善我们的应用程序性能的方法就是清楚我们程序中的不需要的CSS和脚本文件。有时我们的程序中存在很多旧的CSS,而且在开发程序时,在不断完善系统的过程中,可能会遗留很多没用的脚本文件或脚本程序。需要网站使用了一个单独的CSS或脚本文件来满足整个网站的需要。这样做将会产生大量的数据和代码冗余。有时,只要简单地清楚这些文件,就可以通过改变Web页的大小的方式来改善我们网站的性能。如果我们在网站的代码中继续引用不再使用的CSS或脚本文件,那么在每次加载网页时它们都会进行被传输,这样将是对网络资源的一种浪费。我们可以通过运行一个Web页分析器来准确地知道哪个页被转载,哪个页装载的时间最长。
5. 装载测试和Visual Studio Team系统
装载测试从本质上说是发现系统的性能问题,并测量系统在单位时间内的响应次数。Visual Studio Team系统(VSTS)包括了一个强大的简单的工具,用来对Web程序进行装载测试,并提供更有价值的报告。使用测试模板可以非常简单地按着系统所提示的步骤建立一个测试工程。我们可建立一个或多个Web测试,并为每一个Web测试配置相应的属性来模拟不同的用户。
通过使用VSTS提供的Web页记录器,可以纪录我们为了建立Web测试而在我们的网站中执行的一系列步骤。Web测试通过模拟的用户进行测试,这将作为装载测试的一部分。我们还可以使用性能监视器在我们的服务器上安装性能计数器。使用性能计数器监测我们的Web服务器上发生的一些特殊活动数据,如私有字节、虚拟字节以及CPU使用率等。如果我们在应用程序中有内存漏洞,那么我们很容易通过监视内存来发现这些漏洞。我们所得到的结果将以来于应用程序装载什么而有细微的差别,但是我们的Web服务器的内存应该达到一个一致的水平,并保持稳定。图1显示了一个VSTS装载测试的例子。
6、总结
上面所提到的五个用于改善Web性能的方法非常快捷,并不需要更多的开发经验和工作技巧。然而,如果我们决定采用这些步骤来处理我们的Web应用程序时,请对它们做一个仔细的分析,并研究每一个方面以便做出个正确的决定来如何优化。最好的方法是在进行开发之前做一个详尽的结构图和计划书。最后希望读者可以从本文找到用于改善自己的Web程序性能有用的方法。