getConfig函数的运行时间


12

我测量了页面的运行时间,并注意到函数getBaseCurrencyCode()花费了一秒钟来运行。我所有的缓存均已启用。

我检查了功能,并看到以下命令:

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

需要一秒钟。

但是当我使用 Mage::getConfig()->getNode(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE); 它需要毫秒

谁能告诉我为什么会发生这种时差?

有什么建议吗?


尽管我已经尝试过为您提供的建议解决方案,但是仍然存在巨大的时间空白。如果您可以尝试测量运行getConfig函数并将其发布到此处所需的时间,我将非常高兴。

我尝试通过用microtime函数包装此代码来测量此函数花费的时间

即在本地路径上:app\code\core\Mage\Core\Model 代替此行:

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

我将其替换为以下代码(与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;

我的输出是:

function: getConfig() took me: 1.1326711177826 sec

我很高兴看到您的输出和运行时。

Answers:


4

两者之间的配置解析存在细微差异,但这些差异不应影响性能。这两种方法都只是通过一个大数组来检索数据。
getConfig实际上进行一些简单的计算然后调用getNode
我看到的唯一最大区别是$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)调用此:$this->_processConfigValue($fullPath, $path, $data);
这部分处理带有标记的指令,{{...}}并且在某些情况下该方法在某些情况下称其为self。
删除_processConfigValue呼叫后,尝试对2进行基准测试。


3

你打电话时

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

它会打电话

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

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

当你打电话时

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

它将读取xml文件并返回输出。

我认为按照@Marius先生的建议,它不会影响性能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.