我发现每当我禁用 nhibernate 反射优化器时,初始化会话工厂的速度就会大大加快。这对于测试目的非常有用。
<add key="hibernate.use_reflection_optimizer" value="false" />
我的问题是这样做会产生什么连锁反应,为什么它不是默认设置?一切seems一样地工作。
如果您想要的不仅仅是复制粘贴手册中提到的反射优化器的单段内容,还有一个很好的讨论here http://jaychapman.blogspot.com/2007/11/nhibernate-access-performance.html反射优化器的性能改进,以及对方法的简要讨论。
根据我有限的理解(这全部来自阅读,我没有进行任何实验,因此欢迎指正),缺点是实际上有两个反射优化器:
codedom https://nhibernate.svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs,它基本上是生成然后编译的代码(即 nhibernate 为您的实体生成包装器 Getter/Setter 代码,然后编译它)。从表面上看,这只适用于公共成员,并且可能是extra使用起来很昂贵,因为它天真地生成包装类(无论特定字段是否是公共的),尝试编译它并在失败时抛出异常。
轻量级代码生成 https://nhibernate.svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/,它使用 Reflection.emit 的神秘实践来获取/设置值。这对我来说仍然是一个非常新的领域,但个人实验this http://www.codeproject.com/KB/cs/Dynamic_Code_Generation.aspx表明您可以使用 SRE 非常快速地操作私有变量,并且source https://nhibernate.svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate/Properties/至少似乎为基本字段/属性提供发射,无论访问修饰符如何。这是默认设置。
至于连锁反应 - 嗯,从闪亮的图表来看1 http://jaychapman.blogspot.com/2007/11/nhibernate-access-performance.html看起来如果你在开发过程中坚持/水合大量重物,它可能会相当大。如果没有(我猜测您不在测试/开发期间),那么关闭它似乎是相当明智的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)