Thời gian chạy chức năng getConfig


12

Tôi đã đo thời gian chạy cho trang của mình và nhận thấy rằng hàm getBaseCurrencyCode () mất hơn một giây để chạy. Tất cả các bộ nhớ đệm của tôi được kích hoạt.

Tôi đã kiểm tra chức năng và thấy rằng lệnh sau:

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

mất hơn một giây.

nhưng khi tôi sử dụng Mage::getConfig()->getNode(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE); thì phải mất một phần nghìn giây

bất cứ ai có thể cho tôi biết tại sao sự khác biệt thời gian này xảy ra?

Lời khuyên nào?


Mặc dù tôi đã thử các giải pháp được đề xuất mà bạn cung cấp nhưng vẫn còn nhiều khoảng trống thời gian. Tôi sẽ rất vui nếu bạn có thể thử và đo thời gian cần thiết để bạn chạy hàm getConfig và đăng nó ở đây.

Tôi đã thử đo thời gian mà hàm này mất bằng cách gói mã này bằng các hàm microtime

tức là trên đường dẫn cục bộ: app\code\core\Mage\Core\Model thay vì dòng này:

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

Tôi đã thay thế nó bằng mã này (cùng mã với 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;

đầu ra của tôi là:

function: getConfig() took me: 1.1326711177826 sec

Tôi sẽ rất vui khi thấy đầu ra và thời gian chạy của bạn.

Câu trả lời:


4

Có một số khác biệt nhỏ trong việc phân tích cấu hình giữa 2 nhưng chúng không ảnh hưởng đến hiệu suất. Cả hai phương thức chỉ cần đi qua một mảng lớn để lấy dữ liệu.
getConfigthực sự làm một số tính toán đơn giản và sau đó gọi getNode.
Sự khác biệt lớn duy nhất tôi thấy là $this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)gọi đây : $this->_processConfigValue($fullPath, $path, $data);.
Phần này xử lý các chỉ thị được đánh dấu {{...}}và tại một số điểm, phương thức tự gọi nó trong các trường hợp nhất định.
Cố gắng điểm chuẩn 2 sau khi bạn loại bỏ _processConfigValuecuộc gọi.


3

Khi bạn gọi

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

Nó sẽ gọi

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

cũng thế

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

và khi bạn gọi

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

Nó sẽ đọc xmltập tin và trả lại đầu ra.

Tôi nghĩ Theo @Marius, ông đề nghị và nó sẽ không ảnh hưởng đến hiệu suất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.