2011-02-11 2 views
3

Ce code prend ~ 0.1svitesse du curseur de PHP Mongo très lent

// 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); 

donc "find()" a pris seulement 0,000017 secondes mais "marche du curseur" 0.102812 secondes

Collection est d'environ 100 lignes, la vitesse reste la même avec 1000 ou seulement 10 éléments dedans.

Quelques informations sur le serveur: FreeBSD 8.1, PHP 5.3.5 avec (mongo/1.1.4), la version 1.6.6-MongoDB pré

+0

@mika: Je doute vraiment qu'il vous a fallu 0,0005s en python pour se connecter à DB et récupérer des résultats. Le test ci-dessus n'est pas représentatif. – johndodo

Répondre

4

Avec un temps rapide, il semble que find ne l'a pas tout sauf préparer un objet (pas de communication avec la base de données), et c'est seulement en utilisant le curseur que la requête a été exécutée et que les résultats ont été lus. Le curseur fait le travail, c'est pourquoi c'est plus lent. Je sais que c'est ainsi que fonctionnaient les pilotes mongodb de node.js. Si vous l'avez regardé comme ça, la vitesse du curseur n'est pas mauvaise pour ouvrir une connexion, authentifier, envoyer la requête, recevoir et mettre en mémoire tampon la réponse, puis l'analyser/la charger dans un objet pour revenir à vous.

+0

Le mot "probablement" n'est pas nécessaire ... :) C'est en effet le cas. La fonction find() ne fait rien par elle-même, sinon elle serait * très * inefficace: '$ collection-> find() -> limit (10);'. +1 pour la note sur la vitesse - le benchmark ne peint pas l'image correcte (car elle inclut le temps de configuration de la connexion). – johndodo