getConfig 기능 런타임


12

내 페이지의 런타임을 측정하고 getBaseCurrencyCode () 함수가 실행하는 데 1 초 이상 걸리는 것을 알았습니다. 모든 캐싱이 활성화되었습니다.

기능을 조사한 결과 다음 명령을 확인했습니다.

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

1 초가 넘습니다.

하지만 내가 사용할 때 Mage::getConfig()->getNode(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE); 밀리 초가 걸립니다

아무도 왜이 시차가 발생하는지 말해 줄 수 있습니까?

어떤 충고?


귀하가 제안한 솔루션을 시도했지만 여전히 시간 차이가 큽니다. getConfig 함수를 실행하고 여기에 게시하는 데 걸리는 시간을 측정하고 측정 할 수 있다면 기쁠 것입니다.

이 코드를 마이크로 타임 함수로 감싸서이 함수에 걸리는 시간을 측정하려고했습니다.

app\code\core\Mage\Core\Model ,이 줄 대신 로컬 경로 :

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

나는이 코드로 교체했다 (마이크로 타임과 동일한 코드) :

$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

나는 당신의 출력과 런타임을 보게되어 기쁩니다.

답변:


4

2 사이의 구성 구문 분석에는 약간의 차이가 있지만 성능에는 영향을 미치지 않아야합니다. 두 방법 모두 데이터를 검색하기 위해 큰 배열을 거칩니다.
getConfig실제로 몇 가지 간단한 계산을 수행 한 다음을 호출합니다 getNode.
내가 볼 수있는 유일한 큰 차이점 $this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)은 이것을 다음 과 같이 부르는 것 $this->_processConfigValue($fullPath, $path, $data);입니다.
이 부분 {{...}}은 특정 상황에서 메소드가 표시된 지시문을 처리 하고 어떤 시점에서 메소드를 자체 호출합니다. 통화
를 제거한 후 2를 벤치마킹하십시오 _processConfigValue.


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 선생님이 제안한 대로 성능에 영향을 미치지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.