contao / core

Contao 3 → see contao/contao for Contao 4
GNU Lesser General Public License v3.0
492 stars 213 forks source link

Performance Verbesserung: Ergebnis von listFields in Database.php cachen #609

Closed ghost closed 12 years ago

ghost commented 12 years ago

Hi Leo, Bei einer Analyse bzgl. kleinerer Performance-Problemchen ist mir aufgefallen, dass die Funktion Database::listFields für die gleiche Tabelle je nach Seiteninhalt mehrfach aufgerufen wird (bei einer Beispielseite bei uns z.B. 63 mal). Der Rückgabewert ist natürlich immer der gleiche. Durch ein Cachen dieses Rückgabewertes konnte ich die Zeit zur Erzeugung der Beispielseite auf die Hälfte reduzieren. Folgendes habe ich geändert: in system/Database.php neue Variable

protected $cachedFieldLists;

und Änderung von listFields in:

public function listFields($strTable)
{
  if (!isset($this->cachedFieldLists[$strTable])) {
    $this->cachedFieldLists[$strTable] = $this->list_fields($strTable);
  }
  return $this->cachedFieldLists[$strTable];
}

Spricht etwas dagegen und sollte die Änderung vielleicht in den Typolight-Kern übernommen werden?

--- Originally created by anonymous on March 20th, 2009, at 11:40am (ID 609)

leofeyer commented 12 years ago

Ja, es spricht tatsächlich etwas dagegen. Der Rückgabewert muss nämlich nicht immer derselbe sein, es kann sich ja beispielsweise etwas an der Tabelle ändern. Mich wundert zudem, wieso diese Funktion bei Dir überhaupt im Frontend aufgerufen wird. Ich habe gerade die Demo geprüft und wie erwartet taucht die Funktion dort überhaupt nicht auf!

Ich schätze also, es liegt an einer Erweiterung. Welche verwendest Du?

--- Originally created on March 24th, 2009, at 10:09am

ghost commented 12 years ago

Ok, ob sich während eines Seitenaufrufes tatsächlich etwas an der Tabelle ändern kann, übersehe ich nicht. Ich habe jetzt noch mal genauer geguckt, Ursache ist bei mir wohl ModuleNavigationSub.php und dort der Aufruf von getChildRecords in renderNavigation Zeile 209

if (

![]($this->showLevel || $this->showLevel >= $level || 
()$this->hardLimit && ($objPage->id == $objSubpages->id || 
in_array($objPage->id, $this->getChildRecords($objSubpages->id, 'tl_page')))))

In getChildRecords wird dann fieldExists aufgerufen

if (is_null($blnSorting))
{
  $blnSorting = $this->Database->fieldExists('sorting', $strTable);
}

und das ruft dann wiederum listFields auf.

Gehört ModuleNavigationSub nicht mit zum Core?

--- Originally created by anonymous on March 24th, 2009, at 10:48am

leofeyer commented 12 years ago

Ja, wobei es in der Version 2.7 nicht mehr enthalten sein wird (schon lang veraltet).

Im Frontend ist es tatsächlich eher unwahrscheinlich, dass etwas an den Tabellen geändert wird, wobei es auch dort nicht ausgeschlossen ist! Ich kann mir durchaus entsprechende Einsatzmöglichkeiten vorstellen. Ein guter Kompromiss ist vielleicht eine Option, den Cache wahlweise zu umgehen.

--- Originally created on March 24th, 2009, at 11:05am

ghost commented 12 years ago

... allmählich bekomme ich Angst vor der 2.7! Hoffentlich hält sich der Migrationsaufwand in erträglichen Grenzen... (Aber das gehört natürlich nicht hierher, ich weiß.)

--- Originally created by anonymous on March 24th, 2009, at 11:09am

leofeyer commented 12 years ago

--- Originally completed on March 24th, 2009, at 11:21am