Tempo di esecuzione della funzione getConfig


12

Ho misurato il tempo di esecuzione della mia pagina e ho notato che la funzione getBaseCurrencyCode () impiega più di un secondo per essere eseguita. Tutta la mia memorizzazione nella cache è abilitata.

Ho esaminato la funzione e ho visto che il seguente comando:

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

prende un secondo.

ma quando lo uso Mage::getConfig()->getNode(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE); ci vogliono millisecondi

qualcuno può dirmi perché si verifica questa differenza di tempo?

qualche consiglio?


Anche se ho provato le soluzioni suggerite che hai offerto, ma ci sono ancora enormi lacune temporali. Sarei felice se potessi provare a misurare il tempo necessario per eseguire la funzione getConfig e pubblicarla qui.

Ho provato a misurare il tempo impiegato da questa funzione avvolgendo questo codice con funzioni microtime

cioè sul percorso locale: app\code\core\Mage\Core\Model invece di questa riga:

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

L'ho sostituito con questo codice (stesso codice con 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;

la mia uscita è stata:

function: getConfig() took me: 1.1326711177826 sec

Sarei felice di vedere il tuo output e runtime.

Risposte:


4

Esistono piccole differenze nell'analisi della configurazione tra i 2, ma quelle non dovrebbero influire sulle prestazioni. Entrambi i metodi passano attraverso un grande array per recuperare i dati.
getConfigesegue alcuni semplici calcoli e poi chiama getNode.
L'unica grande differenza che vedo è che $this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)chiama questo: $this->_processConfigValue($fullPath, $path, $data);.
Questa parte elabora le direttive contrassegnate con {{...}}e ad un certo punto il metodo si definisce autonomo in determinate circostanze.
Prova a confrontare i 2 dopo aver rimosso la _processConfigValuechiamata.


3

Quando chiami

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

Chiamerà

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

anche

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 chiami

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

Leggerà il xmlfile e restituirà l'output.

Penso che come suggerito da @Marius, questo non influirà sulle prestazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.