我使用面向方面编程(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尽可能保持一致?那么记录的数量如何 - 更可靠,使用少量记录并运行更多次或其他方式?
答案 0 :(得分:6)
你见过ORMBattle.NET吗?请参阅FAQ there,有一些与测量特定ORM工具引入的性能开销相关的想法。测试套件为open source。
关于你的结果:
P.S。我是ORMBattle.NET的作者之一,所以如果您对细节/可能的贡献感兴趣,可以直接与我联系(或加入ORMBattle.NET Google Groups)。
答案 1 :(得分:3)
我会在更长的时间内运行测试,并且需要更多的迭代,因为随着时间的推移,小的差异会平均,你应该得到更清晰的图像。此外,请确保消除可能影响测试的任何外部因素,例如运行的其他进程,足够的可用内存,冷启动与热启动,网络使用等。
此外,请确保您的数据库文件和日志文件分配了足够的可用空间,这样您就不会在某些测试期间等待DB扩展文件。
答案 2 :(得分:2)
首先,您需要找出方差的来源。 ORM层本身还是数据库?
很多时候,这种差异的来源是数据库本身。数据库是非常复杂的系统,其中有许多活动进程可以与性能测量结果进行交互。为了获得一些可重现的结果,您必须将数据库置于“实验室”条件下,并确保不会发生任何意外情况。这意味着从供应商到供应商,你需要知道一些非常高级的主题,以便这样的东西。例如,在SQL Server数据库上,典型的变化来源是: