2011-02-11 59 views
3

這個代碼大約需要0.1秒PHP蒙戈的光標速度很慢

// find 
$benchmark = Profiler::start ('Testing', 'find()'); 
$cursor = MongoBG::getInstance ()->setDatabase ('test')->setCollection ('testcoll')->find(); 
Profiler::stop ($benchmark); 

$benchmark = Profiler::start ('Testing', 'cursor walk'); 
while ($cursor->hasNext()) { 
    print_r($cursor->getNext()); 
} 
Profiler::stop ($benchmark); 

因此「找到()」只用了0.000017秒 但「光標遊走」0.102812秒

收集大約是100行,速度與1000個或僅10個項目相同。

某些服務器信息: 的FreeBSD 8.1,PHP 5.3.5與(蒙戈/ 1.1.4),MongoDB的版本1.6.6預

+0

@mika:我非常懷疑它需要0.0005s的Python連接到數據庫並檢索結果。上述測試不具代表性。 – johndodo 2011-12-19 12:00:54

回答

4

有了這麼快的時間,這聽起來像find沒做除了準備一個對象(沒有與數據庫通信)之外,只有在使用遊標時纔會執行實際查詢並讀取結果。光標正在做這個工作,這就是爲什麼它慢。

我知道這就是node.js的mongodb驅動程序的工作原理。如果你這樣看,光標速度對於打開連接,驗證,發送查詢,接收和緩衝響應,然後將其解析/加載到對象中以返回給你來說並不是那麼糟糕。

+0

「可能」這個詞是不需要的...... :)確實如此。函數find()本身不做任何事情,否則這將會非常低效:`$ collection-> find() - > limit(10);`。 +1關於速度的說明 - 基準不繪製正確的圖片(因爲它包括連接建立時間)。 – johndodo 2011-12-19 11:50:59