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.
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.