优化DOTTEXT之一:缓存配置项
最近在开发博客,于是想到了OPENSOURCE的DOTTEXT,下载了装好后,感觉功能很完善,所以打算在其基础上建立BLOG SITE。感谢http://www.cnblogs.com/,我装的是CNBlogsDottext10Beta2版本。
我觉得一个BLOG SITE最重要的功能是:
1 换肤功能
2 RSS功能
3 TRACKBACK
在FIX、PERFORMANT以及LOCALIZATION过程中,感觉DOTTEXT的性能比较低,经分析后发现:
对于大量的访问CONFIG配置文件的操作,DOTTEXT并没有提供缓存机制。比如首页,大约有三十次访问BlogConfigurationSettings,而这全部都要执行以下代码:
{
return ((BlogConfigurationSettings)ConfigurationSettings.GetConfig("BlogConfigurationSettings"));
}
类似的还有 HTTP链接动态生成,每次都要由 UrlReWriteHandlerFactory 对REQUEST链接进行分析,这个过程要遍历HttpHandlers,而取得HttpHandlers要执行以下方法:
{
(UrlManager.HandlerConfiguration)ConfigurationSettings.GetConfig("HandlerConfiguration"); }
我们看到,每次访问配置项,都要从CONFIG文件中读取,而且每次都要进行装箱的操作。
为了解决以上问题,我在Dottext.Framework命名空间中建立了CATCHER类来缓存配置项。这是个单例类,代码如下:
using System.Configuration;
namespace Dottext.Framework
{
/// <summary>
/// 作者:丁冬
/// 时间:2006-02-24
/// 说明:将配置项缓存
/// </summary>
public class Catcher
{
private Catcher()
{
}
/// <summary>
/// 缓存BlogConfigurationSettings
/// </summary>
/// <returns></returns>
public static Configuration.BlogConfigurationSettings GetBlogConfigurationSettings()
{
if(_BlogConfigurationSettings == null)
_BlogConfigurationSettings = (Configuration.BlogConfigurationSettings)ConfigurationSettings.GetConfig("BlogConfigurationSettings");
}
}
}
相应的,将BlogConfigurationSettings 类的INSTANCE方法改为:
public static BlogConfigurationSettings Instance()
{
return Catcher.GetBlogConfigurationSettings();
}
这样,每次访问Dottext.Framework.Configuration.BlogConfigurationSettings Instance(),都先去缓存中提取,如果为NULL,则再去读配置文件。
同样的,我在Dottext.Common.UrlManager命名空间中也建立了一个CACHER类,来缓存HandlerConfiguration配置项。之所以不把他们放在一个CATCHER类里,是为了避免装箱操作。
优化后,我以首页为例进行优化前后的对比,结果如下:
Application Center Test
概述: 摘要
| (1) | 测试名称: | ACTSamples: 新BLOG |
| 测试运行名称: | report-新BLOG-二月 25, 2006 10-51-30 | |
| 测试开始时间: | 2006-2-25 10:50:28 | |
| 测试持续时间: | 00:00:01:00 | |
| 测试迭代次数: | 3,760 | |
| 测试说明: | - |
| (2) | 测试名称: | ACTSamples: 老Blog |
| 测试运行名称: | report-老Blog-二月 25, 2006 10-52-40 | |
| 测试开始时间: | 2006-2-25 10:51:38 | |
| 测试持续时间: | 00:00:01:00 | |
| 测试迭代次数: | 1,661 | |
| 测试说明: | - |
测试运行图形
显示错误
| 属性 | |||||
| (1) | (2) | ||||
| 测试类型: | 动态 | 动态 | |||
| 浏览器同时连接数: | 20 | 20 | |||
| 准备时间(秒): | |||||
| 测试持续时间: | 00:00:01:00 | 00:00:01:00 | |||
| 测试迭代次数: | 3,760 | 1,661 | |||
| 生成的详细测试结果: | 是 | 是 | |||
| 摘要 | |||||
| (1) | (2) | ||||
| 请求总数: | 3,762 | 1,663 | |||
| 连接总数: | 3,760 | 1,661 | |||
| 每秒平均请求数: | 62.70 | 27.72 | |||
| 首字节平均响应时间(毫秒): | 298.10 | 691.10 | |||
| 末字节平均响应时间(毫秒): | 299.60 | 693.47 | |||
| 每次迭代末字节平均响应时间(毫秒): | 299.76 | 694.30 | |||
| 测试中的唯一请求数: | 1 | 1 | |||
| 唯一响应代码数: | 1 | 1 | |||
| 错误计数 | |||||
| (1) | (2) | ||||
| HTTP: | |||||
| DNS: | |||||
| 套接字: | |||||
| 其他网络统计数据 | |||||
| (1) | (2) | ||||
| 平均带宽(字节/秒): | 1,182,812.80 | 510,220.68 | |||
| 发送字节数(字节): | 1,437,970 | 624,866 | |||
| 接收字节数(字节): | 69,530,798 | 29,988,375 | |||
| 发送字节平均速率(字节/秒): | 23,966.17 | 10,414.43 | |||
| 接收字节平均速率(字节/秒): | 1,158,846.63 | 499,806.25 | |||
| 连接错误数: | |||||
| 发送错误数: | |||||
| 接收错误数: | |||||
| 超时错误数: | |||||
| 响应代码 | |||||
| (1) | (2) | ||||
| Response Code: 200 - 请求已成功完成。 | |||||
| 计数: | 3,762 | 1,663 | |||
| 百分比(%): | 100.00 | 100.00 | |||
|
|
|||||
可以看到,效率提高了2。3倍。
以上我缓存的只是访问比较频繁的两个配置项,我们可以将所有的配置都缓存。以使DOTTEXT性能达到最优。
浙公网安备 33010602011771号