2010-10-24 13 views
0

J'ai 2 ensembles de données comme suit:La fusion de deux matrices d'enregistrement actives est-elle très lente?

default_products - Un ensemble d'objets d'enregistrement actifs récupérés à partir memcached owned_products - Un ensemble d'objets d'enregistrement actifs extraits de la base de données

Récupération des données est rapide et i obtenir environ 30-40 req/s quand juste retour l'un des tableaux encore, dès que je fais ce qui suit pour revenir à la fois:

TOUS_LES_PRODUITS = default_products + owned_products

Performance dégringole à environ 3-4 req/s. Pourquoi cette opération est-elle si lente? Existe-t-il un autre moyen de faire cela pour accélérer les choses? Les «produits» utilisent STI pour avoir des sous-classes telles que «meubles» et «vêtements», ce qui pourrait causer des problèmes de performance?

Merci

+0

Quelle est la taille de ces deux matrices? – SteveRawlinson

Répondre

0

Je devine que l'utilisation de l'opérateur « + » fait les choses lentement, car en réalité un nouvel alloue objet. Je suppose que cela pourrait aussi être le résultat de la collecte des ordures étant déclenchée. Si cela ne vous dérange pas de modifier l'un ou l'autre tableau, vous pouvez utiliser l'opérateur '< <', ce qui est vraiment rapide.

Voici comment j'ai mesuré la différence de vitesse et illustré l'effet secondaire de la modification de la matrice.

require 'benchmark' 

a, b = [], [] 
array_size = 1000 
random_limit = 1000 

array_size.times { a << rand; b << rand } 

p "starting count and object_ids" 
p a.count, a.object_id 
p b.count, b.object_id 

p "resulting object_ids" 
p (a<<b).object_id 
p (a + b).object_id 


n = 50000 
Benchmark.bm do |x| 
    x.report { n.times {a + b }} 
    x.report { n.times {a << b }} 
end 

p "notice that the count has changed from 1000 to 51000 for the '<<' method" 
p a.count, a.object_id 
p b.count, b.object_id 
0

Si vous avez aucune utilité pour les anciennes variables après, vous pouvez utiliser Array.concat

default_products.concat(owned_products) 

Cela devrait être plus rapide que d'ajouter les tableaux ensemble et renvoyer le résultat car il n'a pas pour créer un nouvel objet.

Voir: http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat