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.

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.