测试自定义ORM解决方案性能开销 - 如何?

时间:2009-12-30 21:23:53

标签: sql-server performance testing orm ado.net

我使用面向方面编程(PostSHarp)创建了一个自定义ORM工具的原型,并实现了持久性无知(在编译时之前)。现在,我尝试了解与使用纯DataReader和ADO.NET相比,它引入了多少开销。我做了一个测试用例 - 在MS SQL Server 2008和MySQL Community Edition中插入,读取,删除数据(大约1000条记录)。我使用纯ADO.NET和我的自定义工具多次运行此测试。

我预计结果将取决于许多因素 - 内存,交换,CPU,其他进程,因此我多次运行测试(20-40)。但结果真的出乎意料。他们在这些案件之间差别太大。如果只有一些极端值,我可以忽略它们(可能是交替出现或者像那样)但它们是如此不同以至于我确信我不相信这种测试。几乎一半的时间我的ORM表现出比纯ADO.NET好10%的性能,有时甚至是-10%。

有什么方法可以让这些测试可靠吗?我没有一台拥有大量内存的强大计算机,但也许我可以在某些测试中使MS SQL和MySQL或ADO.NET尽可能保持一致?那么记录的数量如何 - 更可靠,使用少量记录并运行更多次或其他方式?

3 个答案:

答案 0 :(得分:6)

你见过ORMBattle.NET吗?请参阅FAQ there,有一些与测量特定ORM工具引入的性能开销相关的想法。测试套件为open source

关于你的结果:

  • 某些ORM工具会自动批处理语句序列(即将多个SQL语句一起发送)。如果在ORM中很好地实现了这个功能,那么如果ADO.NET测试不涉及批处理,那么在CRUD操作上很容易击败普通的ADO.NET 2-4次。对ORMBattle.NET的测试测试两种情况。
  • 很大程度上取决于您如何在那里建立交易边界。有关详细信息,请参阅ORMBattle.NET FAQ
  • CRUD测试根本不是最佳性能指标。一般来说,它很容易获得 这里可能达到峰值,因为一般来说,在这种情况下,RDBMS必须比ORM做得更多。

P.S。我是ORMBattle.NET的作者之一,所以如果您对细节/可能的贡献感兴趣,可以直接与我联系(或加入ORMBattle.NET Google Groups)。

答案 1 :(得分:3)

我会在更长的时间内运行测试,并且需要更多的迭代,因为随着时间的推移,小的差异会平均,你应该得到更清晰的图像。此外,请确保消除可能影响测试的任何外部因素,例如运行的其他进程,足够的可用内存,冷启动与热启动,网络使用等。

此外,请确保您的数据库文件和日志文件分配了足够的可用空间,这样您就不会在某些测试期间等待DB扩展文件。

答案 2 :(得分:2)

首先,您需要找出方差的来源。 ORM层本身还是数据库?

很多时候,这种差异的来源是数据库本身。数据库是非常复杂的系统,其中有许多活动进程可以与性能测量结果进行交互。为了获得一些可重现的结果,您必须将数据库置于“实验室”条件下,并确保不会发生任何意外情况。这意味着从供应商到供应商,你需要知道一些非常高级的主题,以便这样的东西。例如,在SQL Server数据库上,典型的变化来源是:

  • 冷缓存与热缓存(数据和过程)
  • 日志和数据库增长事件
  • 维护工作
  • 幽灵清理
  • 懒惰的作家
  • 检查点
  • 外部记忆压力