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