czas działania funkcji getConfig

12

Zmierzyłem czas działania mojej strony i zauważyłem, że uruchomienie funkcji getBaseCurrencyCode () zajmuje ponad sekundę. Całe moje buforowanie jest włączone.

Sprawdziłem funkcję i zobaczyłem, że następujące polecenie:

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

zajmuje ponad sekundę.

ale kiedy używam Mage::getConfig()->getNode(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE); , zajmuje to milisekundy

czy ktoś może mi powiedzieć, dlaczego występuje ta różnica czasu?

jakakolwiek rada?


Wprawdzie wypróbowałem zaproponowane przez Ciebie rozwiązania, ale nadal istnieją ogromne luki czasowe. Byłbym szczęśliwy, gdybyś mógł zmierzyć czas potrzebny do uruchomienia funkcji getConfig i opublikowania jej tutaj.

Próbowałem zmierzyć czas działania tej funkcji, pakując ten kod w funkcje mikrotimowe

tj. na ścieżce lokalnej: app\code\core\Mage\Core\Model zamiast tej linii:

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

Zastąpiłem go tym kodem (ten sam kod z 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;

moja produkcja to:

function: getConfig() took me: 1.1326711177826 sec

Byłbym szczęśliwy widząc twoją wydajność i środowisko uruchomieniowe.

builder91
źródło

Odpowiedzi:

4

Istnieją niewielkie różnice w analizowaniu konfiguracji między 2, ale nie powinny one wpływać na wydajność. Obie metody po prostu przechodzą przez dużą tablicę w celu pobrania danych.
getConfigfaktycznie wykonuje kilka prostych obliczeń, a następnie wywołuje getNode.
Jedyna duża różnica widzę, że $this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)nazywa to: $this->_processConfigValue($fullPath, $path, $data);.
Ta część przetwarza dyrektywy oznaczone {{...}}i w pewnym momencie metoda nazywa to siebie w pewnych okolicznościach.
Spróbuj usunąć 2 po usunięciu _processConfigValuepołączenia.

Marius
źródło
3

Kiedy zadzwonisz

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

Zadzwoni

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

również

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;
    }

i kiedy zadzwonisz

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

Odczyta xmlplik i zwróci wyjście.

Myślę, że jak sugeruje pan @Marius , nie wpłynie to na wydajność.

Keyur Shah
źródło