当前位置: 首页 > 科技观察

MongoDB的JavaScript性能

时间:2023-03-14 15:06:37 科技观察

mongodb的db.eval  mongodb使用javascript作为shell,mongodb的db.eval可以提供类似于这个javascriptshell的数据驱动的js接口。这是一种移动代码风格(MobileCodeSytles)的架构设计。我希望使用这个接口在mongodb节点上运行一些处理逻辑。避免在PHP中多次获取和操作mongodb数据。(这个需求和传统数据库的存储过程类似)  但是测试发现javascript在mongodb中运行的性能并不理想。我写了一个测试代码并运行了10,000个周期:selectDB("attl");$echo_func=<<"dzg","values"=>array(1,2,3),"bool"=>true);$arr=array(1,2,3,4,5,6,7,8);$map=array("a"=>1,"b"=>2);$response=$db->e??xecute($echo_code,array($obj,$arr,$map));var_dump($response);$endtime=microtime(true);echo"\ntime:".($endtime-$bgtime)."\n";  执行:phpab-mongo.phparray(2){["retval"]=>float(867000000)["ok"]=>float(1)}时间:6.0353651046753  这个js执行了6秒!在其他环境下测试同样的功能代码:  GoogleChrome:仅70ms  Firefox5:仅180ms  用PHP5执行类似代码:仅630ms测试,mongodb的javascript性能太差了。  排除测试干扰  根据mongodb官方文档Server-sideCodeExecution:Limitationsofeval>Writelocks的章节,我怀疑可能是Writelocks引起的。但这种怀疑与这个例子关系不大。锁应该只影响并发执行。现在的问题是一次执行太慢了。  另外,我也很担心js代码从PHP传输到mongodb的速度慢。  所以就采取了两种方式排除这两个因素:  使用db.system.js.save({_id:“mytestfunc”,value:function(){…}});将测试js代码制作成mongodbSupportedStoredJavaScript  使用db.runCommand({$eval:function(){returnmytestfunc();},nolock:true})调用nolock  发现问题还在那里。结论是mongodbJavaScript执行有问题  测试Mongodb+V8JavaScript引擎  知道Mongodb的JavaScript引擎是SpiderMonkey,所以想尝试编译一个v8版本的Mongodb,准备使用以下JavaScript文件对其进行测试。  准备测试代码functiondotest(){varstr="xxxxxxxxxxxxxxxxxx0000000000";vardata=str+str+str+str;vardata=data+data+data+data;varmax=10000;vararr=[];vartotal=0;for(vara=0;a<100;a++){for(vari=0;i