亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 6383 | 回復: 1
打印 上一主題 下一主題

[MongoDB] MongoDB的JavaScript性能 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-02-22 15:02 |只看該作者 |倒序瀏覽
MongoDB的JavaScript性能





兩個多月前,我與下文作者dulao5兄有過一次關(guān)于MongoDB JavaScript執(zhí)行效率的聊天,昨天dulao5完成此文,將鏈接發(fā)給我,我看完后對測試結(jié)果很是震驚,下面是原文,歡迎對MongoDB JavaScript引擎有研究的同學共同探討。

原文:www.dulao5.com

mongodb的db.eval
mongodb使用javascript做shell, mongodb的db.eval可以提供給數(shù)據(jù)驅(qū)動與這種javascript shell類似的js接口. 這算是一種移動代碼風格(Mobile Code Sytles)的架構(gòu)設(shè)計吧. 我期望可以利用這個接口, 將一些處理邏輯放在mongodb的節(jié)點上運行. 避免在PHP里面多次獲取和操作mongodb的數(shù)據(jù). (這個需求類似傳統(tǒng)數(shù)據(jù)庫的存儲過程)

但是測試卻發(fā)現(xiàn), 在mongodb里面跑javascript性能很不理想. 我寫了一段測試代碼, 跑10000次循環(huán):
  1. [code]<?php
  2. $mongo = new Mongo("mongodb://localhost:20237/");
  3. $db = $mongo->selectDB("attl");

  4. $echo_func = <<<JAVASCRIPT
  5. function() {
  6.         var str = "xxxxxxxxxxxxxxxxx0000000000";
  7.         var data = str + str + str + str;
  8.         var data = data + data + data + data;
  9.         var max = 10000;
  10.         var arr = [];
  11.         var total = 0;

  12.         for(var a=0; a<100; a++) {
  13.                 for(var i=0; i<max; i++) {
  14.                         arr.push( data + " . " + data);
  15.                 }
  16.                 for(var i=0; i<arr.length; i++) {
  17.                         total += arr[i].length;
  18.                 }
  19.                 arr = [];
  20.         }
  21.         return total;
  22. }
  23. JAVASCRIPT;

  24. $bgtime = microtime(true);

  25. $echo_code = new MongoCode($echo_func);
  26. $obj = (object)array("name"=>"dzg", "values"=>array(1,2,3), "bool"=>true) ;
  27. $arr = array(1,2,3,4,5,6,7,8);
  28. $map = array("a"=>1, "b"=>2);
  29. $response = $db->execute($echo_code, array($obj, $arr, $map));
  30. var_dump($response);

  31. $endtime = microtime(true);

  32. echo "\n time : ".($endtime - $bgtime)."\n";執(zhí)行 :

  33. php ab-mongo.php
  34. array(2) {
  35.   ["retval"]=>  float(867000000)
  36.   ["ok"]=>  float(1)
  37. }
復制代碼
time : 6.0353651046753這段js居然執(zhí)行6秒之久! 在其他環(huán)境下測試同樣功能代碼:[/code]Google Chrome : 只需70毫秒
Firefox 5 : 只需180毫秒
用PHP 5執(zhí)行類似代碼: 只需630毫秒
顯然相比以上測試, mongodb的javascript性能差太大了.

排除測試干擾
根據(jù)mongodb官方文檔 Server-side Code Execution : Limitations of eval > Write locks 一節(jié), 我懷疑也許是Write locks導致的. 但這種懷疑和本例關(guān)系不大, locks應該只影響并發(fā)執(zhí)行, 現(xiàn)在的問題是一次執(zhí)行都這么慢.

另外, 我還擔心從PHP到mongodb的js代碼傳遞環(huán)節(jié)慢.

于是花了兩種手段排除這兩個因素:

使用 db.system.js.save({_id: “mytestfunc”, value: function () { … }}); 的方式, 將測試的js代碼作成mongodb支持的Stored JavaScript

使用 db.runCommand({$eval: function() {return mytestfunc();}, nolock: true}) 的方式, 進行nolock調(diào)用

結(jié)果發(fā)現(xiàn)問題依舊. 結(jié)論是mongodb的JavaScript執(zhí)行環(huán)節(jié)有問題

測試Mongodb + V8 JavaScript引擎
我知道Mongodb的JavaScript引擎是SpiderMonkey, 于是想嘗試再編譯一個v8版本的Mongodb, 準備用如下JavaScript文件測試一下.

準備測試代碼
  1. function dotest() {
  2.         var str = "xxxxxxxxxxxxxxxxx0000000000";
  3.         var data = str + str + str + str;
  4.         var data = data + data + data + data;
  5.         var max = 10000;
  6.         var arr = [];
  7.         var total = 0;

  8.         for(var a=0; a<100; a++) {
  9.                 for(var i=0; i<max; i++) {
  10.                         arr.push( data + " . " + data);
  11.                 }
  12.                 for(var i=0; i<arr.length; i++) {
  13.                         total += arr[i].length;
  14.                 }
  15.                 arr = [];
  16.         }
  17.         return total;
  18. }

  19. myecho = (typeof console !== 'undefined' && typeof console.log == 'function') ? console.log : print;

  20. a = new Date();
  21. myecho("begin:\t" + a);

  22. myecho("result:\t" + dotest());

  23. b = new Date();
  24. myecho("end:\t" + b);

  25. myecho("total time:\t" + (b - a));這個JavaScript腳本能同時跑在4種環(huán)境下:

  26. Chrome / Firefox等瀏覽器環(huán)境
  27. node js的shell
  28. SpiderMonkey 的js shell
  29. mongo 的js shell
  30. 我準備編譯完Mongodb的v8版本后, 四個環(huán)境都比較測試一下.

  31. 編譯mongodb + v8
  32. 我在OpenSuse11.4下, 用linux的包管理工具準備編譯環(huán)境, 還是很容易的:

  33. #已安裝的包: g++ subversion git python

  34. sudo zypper install scons tcsh boost-devel pcre-devel readline-devel

  35. svn checkout http://v8.googlecode.com/svn/trunk/ v8
  36. cd v8
  37. scons
  38. cd ..

  39. git clone git://github.com/mongodb/mongo.git
  40. cd mongov8
  41. scons

  42. #run mongodb v8
  43. ./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執(zhí)行測試
  44. 執(zhí)行~/opt/mongov8/mongo localhost:20237 dotest.js

  45. mongo+v8 : 93毫秒
  46. nodejs : 68毫秒
  47. SpiderMonkey : 442毫秒
  48. 初步結(jié)論:
復制代碼
mongodb + v8性能非常好, 接近node.js里面的執(zhí)行性能
SpiderMonkey 1.9 比v8慢5倍
mongodb使用SpiderMonkey肯定有一些環(huán)節(jié)還存在問題, 導致mongodb+SpiderMonkey比mongodb+v8慢60多倍
也許是mongodb的SpiderMonkey版本低? 我目前還不知道m(xù)ongodb的發(fā)行版內(nèi), SpiderMonkey的確切版本
我上面測試SpiderMonkey 的js命令是來自xulrunner-192
測試代碼很短, 比較片面, 上面的性能倍數(shù)只是大體估計, 不是全面精確的評估

論壇徽章:
0
2 [報告]
發(fā)表于 2012-02-24 17:35 |只看該作者
謝謝分享
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP