最近在开发博客,于是想到了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性能达到最优。