• 加快NHibernate的启动速度的小技巧


    今天在《NHibernate 3.0 Cookbook》中学习到一个稍微加快NHibernate速度的小技巧,特地与园友们分享。

    废话不多说直接上代码。请看:

    public class ConfigurationBuilder
        {
            private const string SERIALIZED_CFG = "configuration.bin";
    
            public Configuration Build()
            {
                return Build(null);
            }
    
            public Configuration Build(string cfgpath)
            {
                Configuration cfg = LoadConfigurationFromFile();
                if (cfg == null)
                {
                    if (!string.IsNullOrEmpty(cfgpath))
                        cfg = new Configuration().Configure(cfgpath);
                    else
                        cfg = new Configuration().Configure();
                    SaveConfigurationToFile(cfg);
                }
                return cfg;
            }
    
            private Configuration LoadConfigurationFromFile()
            {
                if (!IsConfigurationFileValid())
                    return null;
    
                try
                {
                    using (var file = File.Open(SERIALIZED_CFG, FileMode.Open))
                    {
                        var bf = new BinaryFormatter();
                        return bf.Deserialize(file) as Configuration;
                    }
                }
                catch (Exception)
                {
                    return null;
                }
            }
    
            private bool IsConfigurationFileValid()
            {
                if (!File.Exists(SERIALIZED_CFG))
                    return false;
    
                var configInfo = new FileInfo(SERIALIZED_CFG);
    
                var asm = Assembly.GetExecutingAssembly();
                if (asm.Location == null)
                    return false;
    
                var asmInfo = new FileInfo(asm.Location);
                if (asmInfo.LastWriteTime > configInfo.LastWriteTime)
                    return false;
    
                return true;
            }
    
            private void SaveConfigurationToFile(Configuration cfg)
            {
                using (var file = File.Open(SERIALIZED_CFG, FileMode.Create))
                {
                    var bf = new BinaryFormatter();
                    bf.Serialize(file, cfg);
                }
            }
        }

    代码很简洁,相信大家已经看出来——将Configuration序列化。

    最后在程序的启动代码中加上:

      private ISessionFactory GetSessionFactory()
      {
          //note:測試時須給出絕對地址,不然不能找到配置文件
          var nhConfiguration = new ConfigurationBuilder().Build(@"E:\Projects\Practice\NHibernateTest\DAL\nhibernate.cfg.xml");
          return nhConfiguration.BuildSessionFactory();
    
          // return new Configuration().Configure(@"E:\Projects\Practice\NHibernateTest\DAL\nhibernate.cfg.xml").BuildSessionFactory();
      }

    让我们简单测试一下。当然在程序第一次启动时,可定是没有序列化后的二进制文件的,程序执行反而会慢,但之后就会快一点了。(所以我们忽略了第一次的测试结果)

      [Test]
       public void LoadExsitingEntityTest()
       {
            Console.WriteLine("加載持久化實例");
            ISession session = helper.GetSession();
            Customer customer = session.Load<Customer>(12);
            Assert.IsNotNull(customer);
            Console.WriteLine("訪問實例的CustomerId屬性");
            Console.WriteLine("這個實例的CustomerId屬性: {0}", customer.CustomerId);
            Assert.AreEqual(customer.CustomerId, 12);
            Console.WriteLine("訪問FirstName屬性");
            Console.WriteLine("該實例FirstName屬性: {0}", customer.FirstName);
      }

    测试也很简单,Load一下^_^

    当使用上面注释的方法时,耗费时间为:2.7秒

    而使用优化过的方法的耗费时间为:2.23秒

    当然,我是测试了好几次的,只不过没有传图,仅根据这个用例来说,大概会快0.5S

    也许,这点时间对您来说微不足道,但是如果用例多了,积累下来也是不小的开销。

    欢迎拍砖!

    物有所不足,智有所不明。
  • 相关阅读:
    HDU1069:Monkey and Banana(DP+贪心)
    hdu 4497 GCD and LCM(2013 ACM-ICPC吉林通化全国邀请赛——题目重现)
    vb6.0 倒计时
    硬盘分区表
    踽踽独行的岁月,感谢与你的相遇
    每天学点Linux:二
    windows下Qt Creator5.1.0编写程序以及调用OpenCV库
    【每周一译】愚蠢的指标:Java中使用最多的关键字
    centos 7 没有ifconfig 命令
    About stats collected
  • 原文地址:https://www.cnblogs.com/mezero/p/2771429.html
Copyright © 2020-2023  润新知