python和C++的对象关系映射(ORM)的性能测试
python和C++的对象关系映射(ORM)的性能测试,在MartinFowler写的书[PatternsofEnterpriseApplicationArchitecture,2002]中提出的设计模式对现代的应用程序与关系数据库的交互操作方式产生了极大的影响。在这一领域里,最有效的方法是对象关系映射(ORM)。乍一看这个机制是主要用于业务逻辑对象和数据表之间的对应关系的映射。不同的ORM在具体的实现上有些差别,但是所有的ORM工具的原理都是创建一个新的抽象层,这样做的目的是希望简化对象的操作和包括应用程序的逻辑关系在内的关系。使用对象-关系映射很大程度上促进了联机事务处理系统(OLTP)发展出更高水平。选择用ORM架构将会影响整个工程的结构,所以如果想在已有的工程中添加该架构,最大的好处可能就是这个架构的广告效应。
不同的ORM解决方案开销会有什么不同呢?是否像SQLAlchemy的作者MichaelBayer在[SQLAlchemy文章地址.:http://aosabook.org/en/sqlalchemy.html]中所说的那样,这些性能的损失并不重要,而且会随着支持JIT的PyPy技术得到更多人认可而消失掉。这些都很难回答,因为我们需要各种不同ORM解决方案的单元测试结果的进行比较。
这篇文章中,我们将对比两种ORM的解决方案SQLAlchemyforPython和YB.ORMforC++[YB.ORM简介]的开销。为了达到这个目的,我们搭建了连个特殊的测试环境,两个环境都有相同的OLTP逻辑和一样的测试套件来测试他们。
测试台
针对测试服务器应用,我们选择了以下主题:停车场自动化。主要操作包括:发放停车票,计算停车时间,支付服务,离开停车场时停车票回收,这就是所谓的后付费模式。预先付费模式也会被应用到,就是用户先支付一定时间的费用,然后可以在任意时间内支付费用延长停车时间,等用户离开停车场后,剩下没有用掉的时间将会发送到用户账户中,将用于下一次的支付。这些模式都符合CRUD(创建,读取,更新和删除)语义。
这些测试平台的源代码可以再Github上获取到:https://github.com/vnaydionov/teststand-parking
在这个上面你可以找到测试平台和两个应用,用于我们需要测试的两种平台:
Parking文件夹——python语言,使用的是SQLAlchemy(以下简称sa)
Parkingxx文件夹——C++语言,使用YB.ORM(以下简称jborm)
两个软件都是单一的测试套件,通过程序提供的API接口设置测试案例实现测试。这个测试套件是用python的标准测试模块unittest写成的。并且,两个测试程序在测试的时候都会显示“绿灯”。
为了在不同平台上运行同一个测试套件,我们需要进行某种形式的进程通讯(IPC)。最广普遍的进程通讯方法是通过SocketAPI,这套接口允许同一主机或者不同主机的进程间进行通信。我们这次测试用的API就采用类似TCPsocket的方式,使用HTTP协议进行请求包/响应包的解析,并且使用JSON格式作为数据的格式。在python的测试服务器应用程序(sa)中,我们使用SimpleHTTPServer模块做HTTP服务器。在C++的测试服务器应用程序(yborm)中,我们使用HTTpServer类(在项目中的文件parkingxx/src/micro_http.h,parkingxx/src/micro_http.cpp),运行examples/auth文件夹下的YB.ORM工程。为了让测试更加完美,我们把所有测试和应用程序都放在一个多核CPU的计算机上运行。
在实际的测试环境中,几乎每时每刻都会有请求需要程序来处理。总所周知,在CPython中,在多线程处理的时候有一个瓶颈,这是又python的解释器引起的。因此,我们用多进程来代替多线程来运行python的服务器程序。另一方面,在C++中没有这样的限制,因此测试的结果不会受线程/进程池的影响,只需要连续的向服务器发送请求就行了。
我们使用MySQL数据库服务器的处理引擎,两个服务器程序运行在相同的数据库实例中。
通过以上的配置,两种不同的程序运行就会产生相同的日志。所有的日志信息包括WEB服务器和数据库记录的。此外,我们自己写的测试程序没有产生日志。
这两个实现基本上是以同一种方式工作。为了更加简化的对比两个程序运行情况,程序代码的逻辑结构也被规范成相似的结构。本文中,我们不讨论ORM工具的执行效率,尽管它很重要。我们只是对比一些运行数据,代码的大小也被限制在了相似的大小:20.4KB(sa)对比22.5KB(yborm)的逻辑代码大小。以及3.4KB(sa)比5.7KB(yborm)的数据模块描述。以下是一段业务逻辑代码,用SQLAlchemy和Python写的:
defcheck_plate_number(session,version=None,
registration_plate=None):
plate_number=str(registration_plateor'')
assertplate_number
active_orders_count=session.query(Order).filter(
(Order.plate_number==str(plate_number))&
(Order.paid_until_ts>datetime.datetime.now())&
(Order.finish_ts==None)).count()
ifactive_orders_count>=1:
raiseApiResult(mk_resp('success',paid='true'))
raiseApiResult(mk_resp('success',paid='false'))
相似的功能在C++和YB.ORM上的实现如下:
ElementTree::ElementPtrcheck_plate_number(Session&session,
ILogger&logger,
constStringDict¶ms)
{
stringplate_number=params["registration_plate"];
YB_ASSERT(!plate_number.empty());
LongIntactive_orders_count=query<order>(session).filter_by(
(Order::c.plate_number==plate_number)&&
(Order::c.paid_until_ts>now())&&
(Order::c.finish_ts==Value())).count();
ElementTree::ElementPtrres=mk_resp("success");
res->add_json_string("paid",active_orders_count>=1?
"true":"false");
throwApiResult(res);
}
</order>
硬件配置和软件包
我们用Ubuntu做测试系统,因为Ubuntu广泛的被用于部署服务器端应用程序。测试在带桌面的电脑上,具体硬件配置如下:Intel(R)Core(TM)i5760@2.80GHz,4GBRAM,running64-bitUbuntu12.04。
软件方面,除了PyPy,PyMySQL,SOCI和YB.ORM以外,其他所有版本的软件包都是从Ubuntu的repos中下载并安装的。
系统内核版本:Linux3.8.0-39-generic#58~precise1-UbuntuSMPx86_64
数据库服务器:MySQL5.5.37-0ubuntu0.12.04.1
MySQL客户端的C接口:libmysqlclient185.5.37-0ubuntu0.12.04.1
Python解释器:CPython2.7.3
MySQL客户端的CPython接口V2:MySQLdb1.2.3-1ubuntu0.1
基于JIT的Python解释器:PyPy2.3.1(http://pypy.org/)
MySQL的PyPy接口:PyMySQL0.6.2(https://github.com/PyMySQL/PyMySQL)
C++编译器:GCCversion4.6.3(Ubuntu/Linaro4.6.3-1ubuntu5)
ODBC驱动管理:UnixODBC2.2.14p2-5ubuntu3
MySQL的ODBC驱动:MyODBC5.1.10-1
C++的数据库连接库:SOCI3.2.0(http://soci.sourceforge.net/)
C++的ORM框架:YB.ORM0.4.5(https://github.com/vnaydionov/yb-orm)
Python的ORM框架:SQLAlchemy0.7.4-1ubuntu0.1(http://www.sqlalchemy.org/)
测试组件的结构
为了知道在测试过程中具体产生了那些函数调用,如表1.那些进行修改数据库的函数都被列出来了。他们的系统占用时间是通过配置YB.ORM和SOCI的后端产生的系统日志计算出来的。
Python培训,Python学习,就选光环大数据Python培训机构!
大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服!