Laufzeit der Funktion getConfig

12

Ich habe die Laufzeit meiner Seite gemessen und festgestellt, dass die Ausführung der Funktion getBaseCurrencyCode () über eine Sekunde dauert. Mein gesamtes Caching ist aktiviert.

Ich habe die Funktion geprüft und festgestellt, dass der folgende Befehl:

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

übernimmt eine Sekunde.

aber wenn ich das benutze Mage::getConfig()->getNode(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE); dauert es millisekunden

Kann mir jemand sagen, warum dieser Zeitunterschied auftritt?

irgendein Rat?


Obwohl ich die von Ihnen vorgeschlagenen Lösungen ausprobiert habe, gibt es immer noch massive Zeitlücken. Ich würde mich freuen, wenn Sie versuchen können, die Zeit zu messen, die Sie benötigen, um die Funktion getConfig auszuführen und hier zu veröffentlichen.

Ich habe versucht, die Zeit zu messen, die diese Funktion benötigt, indem ich diesen Code mit Mikrotime-Funktionen umhüllte

dh auf lokalem Pfad: app\code\core\Mage\Core\Model anstelle dieser Zeile:

$configValue = $this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE);

Ich habe es durch diesen Code ersetzt (derselbe Code mit microtime):

$start = microtime(true);

$configValue = $this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE);

$time_elapsed_secs = microtime(true) - $start;

echo "function: getConfig() took me: " .  $time_elapsed_secs . " sec<br />";

die;

Meine Ausgabe war:

function: getConfig() took me: 1.1326711177826 sec

Ich würde mich freuen, Ihre Ausgabe und Laufzeit zu sehen.

builder91
quelle

Antworten:

4

Es gibt kleine Unterschiede beim Parsen der Konfiguration zwischen den 2, aber diese sollten die Leistung nicht beeinträchtigen. Beide Methoden durchlaufen nur ein großes Array, um Daten abzurufen.
getConfigTatsächlich führt man einige einfache Berechnungen durch und ruft dann auf getNode.
Der einzige große Unterschied, den ich sehe, ist der$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE) nennt dies: $this->_processConfigValue($fullPath, $path, $data);.
Dieser Teil verarbeitet Anweisungen, die mit gekennzeichnet sind, {{...}}und die Methode nennt sich unter bestimmten Umständen selbst.
Versuchen Sie, die 2 zu bewerten, nachdem Sie den _processConfigValueAnruf entfernt haben.

Marius
quelle
3

Wenn du anrufst

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

Es wird anrufen

 public function getConfig($path)
    {
        if (isset($this->_configCache[$path])) {
            return $this->_configCache[$path];
        }

        $config = Mage::getConfig();

        $fullPath = 'stores/' . $this->getCode() . '/' . $path;
        $data = $config->getNode($fullPath);
        if (!$data && !Mage::isInstalled()) {
            $data = $config->getNode('default/' . $path);
        }
        if (!$data) {
            return null;
        }
        return $this->_processConfigValue($fullPath, $path, $data);
    }

ebenfalls

protected function _processConfigValue($fullPath, $path, $node)
    {
        if (isset($this->_configCache[$path])) {
            return $this->_configCache[$path];
        }

        if ($node->hasChildren()) {
            $aValue = array();
            foreach ($node->children() as $k => $v) {
                $aValue[$k] = $this->_processConfigValue($fullPath . '/' . $k, $path . '/' . $k, $v);
            }
            $this->_configCache[$path] = $aValue;
            return $aValue;
        }

        $sValue = (string) $node;
        if (!empty($node['backend_model']) && !empty($sValue)) {
            $backend = Mage::getModel((string) $node['backend_model']);
            $backend->setPath($path)->setValue($sValue)->afterLoad();
            $sValue = $backend->getValue();
        }

        if (is_string($sValue) && strpos($sValue, '{{') !== false) {
            if (strpos($sValue, '{{unsecure_base_url}}') !== false) {
                $unsecureBaseUrl = $this->getConfig(self::XML_PATH_UNSECURE_BASE_URL);
                $sValue = str_replace('{{unsecure_base_url}}', $unsecureBaseUrl, $sValue);
            } elseif (strpos($sValue, '{{secure_base_url}}') !== false) {
                $secureBaseUrl = $this->getConfig(self::XML_PATH_SECURE_BASE_URL);
                $sValue = str_replace('{{secure_base_url}}', $secureBaseUrl, $sValue);
            } elseif (strpos($sValue, '{{base_url}}') !== false) {
                $sValue = Mage::getConfig()->substDistroServerVars($sValue);
            }
        }

        $this->_configCache[$path] = $sValue;

        return $sValue;
    }

und wenn du anrufst

Mage::getConfig()->getNode(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

Es liest die xmlDatei und gibt die Ausgabe zurück.

Ich denke, nach @Marius Sir vorschlagen und es wird nicht die Leistung beeinträchtigen.

Keyur Shah
quelle