waktu menjalankan fungsi getConfig

12

Saya mengukur waktu lari untuk halaman saya dan memperhatikan bahwa fungsi getBaseCurrencyCode () membutuhkan waktu lebih dari satu detik untuk berjalan. Semua caching saya diaktifkan.

Saya memeriksa fungsi dan melihat bahwa perintah berikut:

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

membutuhkan lebih dari satu detik.

tetapi ketika saya menggunakannya Mage::getConfig()->getNode(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE); dibutuhkan milidetik

adakah yang bisa memberitahu saya mengapa perbedaan waktu ini terjadi?

ada saran?


Meskipun saya sudah mencoba solusi yang disarankan yang Anda tawarkan tetapi masih ada kesenjangan waktu yang sangat besar. Saya akan senang jika Anda dapat mencoba dan mengukur waktu yang diperlukan bagi Anda untuk menjalankan fungsi getConfig dan mempostingnya di sini.

Saya mencoba mengukur waktu fungsi ini dengan membungkus kode ini dengan fungsi microtime

yaitu di jalur lokal: app\code\core\Mage\Core\Model alih-alih baris ini:

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

Saya menggantinya dengan kode ini (kode yang sama dengan 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;

output saya adalah:

function: getConfig() took me: 1.1326711177826 sec

Saya akan senang melihat output dan runtime Anda.

pembangun91
sumber

Jawaban:

4

Ada sedikit perbedaan dalam penguraian konfigurasi antara 2 tetapi itu seharusnya tidak mempengaruhi kinerja. Kedua metode hanya melalui array besar untuk mengambil data.
getConfigsebenarnya melakukan beberapa perhitungan sederhana dan kemudian memanggil getNode.
Satu-satunya perbedaan besar saya lihat adalah bahwa $this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)panggilan ini: $this->_processConfigValue($fullPath, $path, $data);.
Bagian ini memproses arahan yang ditandai dengan {{...}}dan pada titik tertentu metode menyebutnya sendiri dalam keadaan tertentu.
Coba patok 2 setelah Anda menghapus _processConfigValuepanggilan.

Marius
sumber
3

Saat Anda menelepon

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

Itu akan memanggil

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

juga

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

dan ketika Anda menelepon

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

Ini akan membaca xmlfile dan mengembalikan output.

Saya pikir sesuai Pak @Marius menyarankan dan tidak akan mempengaruhi kinerja.

Keyur Shah
sumber