web-dev-qa-db-fra.com

Pourquoi loadMultiple charge-t-il 1000 nœuds 9,2 fois plus rapidement que de charger chaque nœud un par un?

J'ai toujours su que charger plusieurs nœuds en même temps était plus rapide que de les charger un par un.

Ce que je ne savais pas, c'est l'énorme différence de performances entre les deux façons de charger les nœuds.

J'ai fait un exemple pour voir la différence. Voici mon résultat:

Charger 1000 nœuds un par un:

$start_time = microtime(TRUE);
foreach (range(1, 1000) as $nid) {
  $node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);
  if ($node) {
    print_r($node->id());
  }
}
$end_time = microtime(TRUE);
print_r($end_time - $start_time);

Temps d'exécution: 10.7266 secondes.

Charger 1000 nœuds en même temps:

$start_time = microtime(TRUE);
$nids = [];
foreach (range(1, 1000) as $nid) {
  $nids[] = $nid;
}

$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($nids);

foreach ($nodes as $node) {
  if ($node) {
    print_r($node->id());
  }
}
$end_time = microtime(TRUE);
print_r($end_time - $start_time);

Temps d'exécution: 1.1664 seconde.

Comment loadMultiple peut-il être 9,2 fois plus rapide que de charger les nœuds un par un?

Est-ce la connexion entre Drupal et la base de données? Quels autres facteurs ralentissent le processus lors du chargement des nœuds un par un?

J'ai effacé le cache après chaque demande pour éviter que les nœuds chargés soient mis en cache.

J'ai utilisé la fonction microtime pour calculer les temps d'exécution exacts.

4
user72672

Il est probable que lorsque vous chargez des nœuds individuels, vous chargez le gestionnaire de type d'entité, puis pour chaque nœud récupérez le stockage, effectuez une requête pour obtenir les données du nœud et créez le nœud. Avec le processus multiple, certaines des requêtes DB sont probablement combinées, et le traitement sera dans un lot plutôt que d'avoir à parcourir le code plusieurs fois.

6
Jaypan