
mongodb的javascript性能
2013/05/01 更新: ------------------------------------------- Mongodb 2.4已经使用v8作为javascript引擎了。 详细见: http://docs.mongodb.org/manual/core/server-side-javascript/ Server-side JavaScript Changed in version 2.4: The V8 JavaScript engine, which became the default in 2.4 ......h3. mongodb的db.eval mongodb使用javascript做shell, mongodb的db.eval可以提供给数据驱动与这种javascript shell类似的js接口. 这算是一种移动代码风格(Mobile Code Sytles)的架构设计吧. 我期望可以利用这个接口, 将一些处理逻辑放在mongodb的节点上运行. 避免在PHP里面多次获取和操作mongodb的数据. (这个需求类似传统数据库的存储过程) 但是测试却发现, 在mongodb里面跑javascript性能很不理想. 我写了一段测试代码, 跑10000次循环:
<?php
$mongo = new Mongo("mongodb://localhost:20237/");
$db = $mongo->selectDB("test");
$echo_func = <<<JAVASCRIPT
function() {
var str = "xxxxxxxxxxxxxxxxx0000000000";
var data = str + str + str + str;
var data = data + data + data + data;
var max = 10000;
var arr = [];
var total = 0;
for(var a=0; a<100; a++) {
for(var i=0; i<max; i++) {
arr.push( data + " . " + data);
}
for(var i=0; i<arr.length; i++) {
total += arr[i].length;
}
arr = [];
}
return total;
}
JAVASCRIPT;
$bgtime = microtime(true);
$echo_code = new MongoCode($echo_func);
$obj = (object)array("name"=>"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->execute($echo_code, array($obj, $arr, $map));
var_dump($response);
$endtime = microtime(true);
echo "\n time : ".($endtime - $bgtime)."\n";
php ab-mongo.php
array(2) {
["retval"]=> float(867000000)
["ok"]=> float(1)
}
time : 6.0353651046753
function dotest() {
var str = "xxxxxxxxxxxxxxxxx0000000000";
var data = str + str + str + str;
var data = data + data + data + data;
var max = 10000;
var arr = [];
var total = 0;
for(var a=0; a<100; a++) {
for(var i=0; i<max; i++) {
arr.push( data + " . " + data);
}
for(var i=0; i<arr.length; i++) {
total += arr[i].length;
}
arr = [];
}
return total;
}
myecho = (typeof console !== 'undefined' && typeof console.log == 'function') ? console.log : print;
a = new Date();
myecho("begin:\t" + a);
myecho("result:\t" + dotest());
b = new Date();
myecho("end:\t" + b);
myecho("total time:\t" + (b - a));
#已安装的包: g++ subversion git python
sudo zypper install scons tcsh boost-devel pcre-devel readline-devel
svn checkout http://v8.googlecode.com/svn/trunk/ v8
cd v8
scons
cd ..
git clone git://github.com/mongodb/mongo.git
cd mongov8
scons
#run mongodb v8
./mongod --quiet --shardsvr --dbpath /home/dzg/data/mongodb/test/mongod --port 20237 --nohttpinterface --fork --pidfilepath /home/dzg/data/mongodb/test/mongod.pid --logpath /home/dzg/log/mongodb/test/mongod.log --logappend
~/opt/mongov8/mongo localhost:20236 dotest.js #mongo+v8
~/opt/mongodb/mongo localhost:20237 dotest.js #mongo+sm
node dotest.js #node.js
js dotest.js #SpiderMonkey 1.9.2
初步结论: * mongodb + v8性能非常好, 接近node.js里面的执行性能; * SpiderMonkey 1.9.2 比v8慢6倍 * mongodb使用SpiderMonkey(版本号?)肯定存在问题, 导致mongodb+SpiderMonkey比mongodb+v8慢71倍; ** 也许是mongodb的SpiderMonkey版本低? 我目前还不知道mongodb的发行版内, SpiderMonkey的确切版本. ** 我上面测试SpiderMonkey 的js命令是来自xulrunner-192 ** Firefox 5的JägerMonkey比SpiderMonkey更快, 和v8很接近(不过单独在这个测试内还是慢) * 测试代码很短, 比较片面, 上面的性能倍数只是大体估计, 不是全面精确的评估.
mongo + v8 93毫秒 mongo 1.8.2 (SpiderMonkey) 6623毫秒 nodejs 68毫秒 SpiderMonkey v1.9.2 442毫秒 Google Chrome 70毫秒 Firefox 5 (JägerMonkey) 180毫秒
--EOF--
若无特别说明,本站文章均为原创,转载请保留链接,谢谢
本文地址: http://www.dulao5.com/javascript/2011/07/30/mongodb-javascript-performance.textile