it-swarm.com.de

Warum lädt loadMultiple 1000 Knoten 9,2-mal schneller als jeder Knoten einzeln?

Ich habe immer gewusst, dass das gleichzeitige Laden mehrerer Knoten schneller ist als das Laden nacheinander.

Was mir nicht bewusst war, ist der enorme Leistungsunterschied zwischen den beiden Arten des Ladens von Knoten.

Ich habe ein Beispiel gemacht, um den Unterschied zu sehen. Hier ist mein Ergebnis:

Laden Sie 1000 Knoten nacheinander :

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

Ausführungszeit: 10.7266 Sekunden.

Laden Sie 1000 Knoten gleichzeitig :

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

Ausführungszeit: 1.1664 Sekunde.

Wie kann loadMultiple 9,2-mal schneller sein als das Laden der Knoten nacheinander?

Ist es die Verbindung zwischen Drupal und der Datenbank? Welche anderen Faktoren verlangsamen den Prozess, wenn die Knoten einzeln geladen werden?

Ich habe den Cache nach jeder Anforderung geleert, um zu vermeiden, dass die geladenen Knoten zwischengespeichert werden.

Ich habe die Funktion microtime verwendet, um die genauen Ausführungszeiten zu berechnen.

4
user72672

Wenn Sie einzelne Knoten laden, laden Sie wahrscheinlich den Entitätstyp-Manager. Rufen Sie dann für jeden Knoten den Speicher ab, führen Sie eine Abfrage durch, um die Knotendaten abzurufen, und erstellen Sie den Knoten. Bei dem Mehrfachprozess werden wahrscheinlich einige der DB-Abfragen kombiniert, und die Verarbeitung erfolgt in einem Stapel, anstatt den Code mehrmals durchlaufen zu müssen.

6
Jaypan