2009-11-21 6 views
1

J'utilise MongoDB pour la première fois et j'essaie de mesurer ses performances. Je cours ruby ​​sur un invité de VirtualBox Ubuntu 9.10 avec un hôte de Windows 7 64-bit. MongoDB est sur un hôte distant, pas sur mon lan buit quelque part dans le nuage Internet.Comment mes timings "Time.now" de Ruby peuvent-ils être si bas quand mes timings "ping" sont si hauts?

Voici mon code:

time1 = Time.now 
rows = coll.find(some_criteria) 
puts ((Time.now - time1) * 1000).to_s 

Le problème est, le temps est si petit, je ne crois pas ce que je vois. Je vois des temps autour de 50, 100, 200 MICRO secondes, tandis que les temps de ping entre mon ordinateur et l'ordinateur mongo à distance sont d'environ 40 MILLI secondes. Suis-je mal compris les unités? Comment mes temps peuvent-ils être si bas quand le ping est si haut?

+0

Vous devez corriger votre mise en forme. –

+0

40 millisecondes est bon – ADAM

Répondre

1

Vous pouvez démarrer un renifleur de paquets, démarrer l'IRB, puis émettre des commandes de test ligne par ligne, mais vous semblez déjà avoir analysé avec précision son comportement dynamique.

Donc, je suppose que vous avez coll avec quelque chose comme coll = db.collection_names? Et je suppose que coll doit être un Enumerable?

Si tel est le cas, rien ne doit vraiment se produire dans cet appel sauf le retour d'un objet avec une méthode each. Peut-être rien ne se passe réellement jusqu'à ce que vous demandiez quelque chose de le Enumerable.

Vous pouvez essayer:

time1 = Time.now 
rows = coll.find(some_criteria) 
o = rows.first 
puts ((Time.now - time1) * 1000).to_s 

Cela ne prendra pas nécessairement plus longtemps. Il est possible que le travail ait été fait quand db.collection_names a été appelé. Le test RIR, à partir du haut, pourrait faire la lumière sur la question ...

+0

Je suis ssh'ed dans l'hôte à distance, en regardant la sortie verbeuse de MongoDB, et à partir de cette sortie I * KNOW * il y a un aller-retour de réseau en cours. Donc, je suis juste déconcerté par la différence de temps de ping contre le temps que ruby ​​mesure. –

+1

Il peut simplement renvoyer un 'Enumerable' ET également démarrer un op de socket pour lequel il n'a pas besoin d'un résultat synchrone. Cela lancerait un aller-retour mais reviendrait aussi immédiatement. – DigitalRoss

0

La réponse est simple: cette ligne ne fait pas ce que vous attendez:

rows = coll.find(some_criteria) 

spécifiquement, il ne communique pas avec le serveur .

Questions connexes