Tempo de execução da função getConfig

12

Eu medi o tempo de execução da minha página e notei que a função getBaseCurrencyCode () leva mais de um segundo para ser executada. Todo o meu cache está ativado.

Examinei a função e vi que o seguinte comando:

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

leva mais de um segundo.

mas quando eu uso o Mage::getConfig()->getNode(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE); leva milissegundos

Alguém pode me dizer por que essa diferença de horário ocorre?

algum conselho?


Embora eu tenha tentado as soluções sugeridas que você ofereceu, ainda existem grandes lacunas de tempo. Ficaria feliz se você pudesse tentar medir o tempo que leva para executar a função getConfig e publicá-la aqui.

Eu tentei medir o tempo que essa função leva, envolvendo este código com funções de microtime

ou seja, no caminho local: em app\code\core\Mage\Core\Model vez desta linha:

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

Substituí-lo por este código (o mesmo código com 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;

minha saída foi:

function: getConfig() took me: 1.1326711177826 sec

Eu ficaria feliz em ver sua saída e tempo de execução.

builder91
fonte

Respostas:

4

Existem pequenas diferenças na análise da configuração entre os 2, mas elas não devem afetar o desempenho. Ambos os métodos passam por uma grande matriz para recuperar dados.
getConfigrealmente faz alguns cálculos simples e depois chama getNode.
A única grande diferença que vejo é que $this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)chama isso: $this->_processConfigValue($fullPath, $path, $data);.
Esta parte processa diretivas marcadas com {{...}}e em algum momento o método se auto denomina sob determinadas circunstâncias.
Tente comparar os 2 depois de remover a _processConfigValuechamada.

Marius
fonte
3

Quando Você ligar

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

Vai chamar

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

Além disso

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

e quando você liga

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

Ele lerá o xmlarquivo e retornará a saída.

Eu acho que, conforme @Marius, o senhor sugere e isso não afetará o desempenho.

Keyur Shah
fonte