zoukankan      html  css  js  c++  java
  • 优化DOTTEXT之一:缓存配置项

    最近在开发博客,于是想到了OPENSOURCE的DOTTEXT,下载了装好后,感觉功能很完善,所以打算在其基础上建立BLOG SITE。感谢http://www.cnblogs.com/,我装的是CNBlogsDottext10Beta2版本。

    我觉得一个BLOG SITE最重要的功能是:

    1 换肤功能

    2 RSS功能

    3 TRACKBACK

    在FIX、PERFORMANT以及LOCALIZATION过程中,感觉DOTTEXT的性能比较低,经分析后发现:

    对于大量的访问CONFIG配置文件的操作,DOTTEXT并没有提供缓存机制。比如首页,大约有三十次访问BlogConfigurationSettings,而这全部都要执行以下代码:

    public static BlogConfigurationSettings Instance()
      {
     return ((BlogConfigurationSettings)ConfigurationSettings.GetConfig("BlogConfigurationSettings"));
      }

    类似的还有 HTTP链接动态生成,每次都要由 UrlReWriteHandlerFactory 对REQUEST链接进行分析,这个过程要遍历HttpHandlers,而取得HttpHandlers要执行以下方法:  

    public static HandlerConfiguration Instance()
      {
       (UrlManager.HandlerConfiguration)ConfigurationSettings.GetConfig("HandlerConfiguration");  }

    我们看到,每次访问配置项,都要从CONFIG文件中读取,而且每次都要进行装箱的操作。

    为了解决以上问题,我在Dottext.Framework命名空间中建立了CATCHER类来缓存配置项。这是个单例类,代码如下:

    using System;
    using System.Configuration;
    namespace Dottext.Framework
    {
     /// <summary>
     /// 作者:丁冬
     /// 时间:2006-02-24
     /// 说明:将配置项缓存
     /// </summary>
     public class Catcher
     {
      private Catcher()
      {
      }
      private static Configuration.BlogConfigurationSettings _BlogConfigurationSettings = null;
      /// <summary>
      /// 缓存BlogConfigurationSettings
      /// </summary>
      /// <returns></returns>
      public static Configuration.BlogConfigurationSettings GetBlogConfigurationSettings()
      {
       if(_BlogConfigurationSettings == null)
        _BlogConfigurationSettings = (Configuration.BlogConfigurationSettings)ConfigurationSettings.GetConfig("BlogConfigurationSettings");
       return  _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
    测试说明: -

    测试运行图形

    9.0.0.6430 15240 10160 '> 9.0.0.6430 15240 10160 '>



    属性
      (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性能达到最优。

  • 相关阅读:
    MFC中char*,string和CString之间的转换(待补充)
    Gem/Bundle/Rvm
    Ruby开发入门
    Maven原型骨架及常见问题
    Nginx Upstream模块源码分析(上)
    mysqldump的几个主要选项探究
    探索Antlr(Antlr 3.0更新版)
    Maven2插件开发入门
    说说家乡的互联网-沈阳
    Nginx模块之SessionSticky
  • 原文地址:https://www.cnblogs.com/jasononline/p/767215.html
Copyright © 2011-2022 走看看