与存储过程相比,我真的很喜欢ORM,但有一件事我担心ORM会因为层次和抽象层而变慢.使用ORM会减慢我的申请吗?或者重要吗?
是的,这很重要.它使用更多的CPU周期,从而减慢了应用程序的速度.虽然听到了我...
但是,考虑一下:什么更贵?服务器硬件还是其他程序员?通常,服务器硬件比雇用另一个程序员团队便宜.因此,虽然ORM可能会花费您的CPU周期,但您需要少一名程序员来管理您的SQL查询,这通常会降低净成本.
要确定它是否适合您,请计算或确定使用ORM保存的小时数.然后,计算出您在服务器上花了多少钱来支持ORM.将您按小时费率保存的小时数乘以服务器成本.
当然,ORM是否真的为您节省了时间,这是另一场辩论......
ORM慢吗?
本质上不是.一些重量级的ORM可以为事物增加一般阻力,但我们并没有谈论数量级减速.
什么确实使ORM慢是天真的使用.如果您正在使用ORM,因为它看起来很简单并且您不知道底层关系数据模型是如何工作的,那么您可以轻松编写对OO程序员来说似乎合理的代码,但会破坏性能.
ORM是一个方便的工具,但你需要低层次的理解(通常来自编写SQL查询)来配合它.
有关系吗?
如果您最终一次为数千个实体中的每个实体执行循环查询,而不是单个快速连接,那么它当然可以.
ORM的速度较慢,并且会增加应用程序的开销(除非您特别知道如何解决这些问题,这不是很常见).数据库是最关键的元素,应该围绕它设计Web应用程序.
许多使用Active Record或ORM的OOP框架,通常是开发人员 - 将数据库视为不重要的事后想法,并倾向于将其视为他们并不真正需要学习的东西.但是性能和可扩展性通常会受到影响,因为数据库需要大量征税!
许多大型网络应用程序已经停滞不前,浪费了数百万甚至数月甚至数年的时间,因为他们没有意识到数据库的重要性.数百个具有数百万条记录的并发用户和表需要数据库调优和优化.但我相信这个问题在一些用户和更少的数据中是显而易见的.
为什么开发人员如此害怕在性能关键时学习正确的SQL和调优措施?
在反对使用SqlCe的Windows Mobile 5项目中,我使用ORM模板从使用手动编码对象转换为代码生成(CodeSmith)对象.在此过程中,我的所有数据访问都使用CSLA作为基础层.
直接转换在本地测试中将我的性能提高了32%,几乎所有这些都是更好的访问方法的结果.
在更改之后,我们调整了模板(在Steve Lasker看到PDC的一些SqlCe性能之后),在不到20分钟的时间内,我们的整个数据层得到了极大的改进,我们的平均"慢"调用从460ms变为~20ms.关于ORM的一个很酷的部分是我们只需要实现(和单元测试)这些更改一次,并且所有数据访问代码都已更改.这是一个惊人的节省时间,我们可能节省40个小时或更多.
如上所述,我们确实失去了一些时间,取出了一堆不再需要的"等待"和"进展"对话框.
我使用了一些ORM工具,我可以推荐其中两个:
.NET层
CSLA codegen模板
它们都表现得相当不错,任何性能损失都不明显.
我一直觉得没关系.您应该使用能够使您最有效率,响应变化的任何内容,以及最容易调试和维护的内容.
大多数应用程序永远不需要足够的负载来使ORM和SP之间的差异显着.并且有一些优化可以使ORM更快.
最后,一个编写良好的应用程序将其数据访问与其他所有内容分开,以便将来从ORM切换到可能的任何内容.