1

我创建了一个自定义助手类模块,我正在调用它:

$bench = Mage::helper('benchmark');
// ... do stuff ...
$bench->addBenchmark();
// ... more stuff ...
$bench->logResults();

这会在数组中输出时间基准的结果。

该类非常简单,它基本上只是将当前添加到一个数组中,然后在调用microtime()时将该数组吐出。logResults()

问题是,我有一个循环,我在其中调用上面的代码,但不是在每个循环中记录一组“新”的基准数据,而是复合自身并添加到现有的基准数组中!

我希望它每次Mage::helper('benchmark');调用时都创建一组新的基准。

任何帮助表示赞赏。

4

2 回答 2

2

使用不可能的助手,除非您在调用该addBenchmark方法时手动刷新数组的内容。

问题出在以下几点。在Mage.php您请求的帮助程序中存储在注册表中。在下一次调用时,将从注册表中检索完全相同的帮助对象,而不是新的。它仅在第一次调用助手时创建一个实例。

/**
 * Retrieve helper object
 *
 * @param string $name the helper name
 * @return Mage_Core_Helper_Abstract
 */
public static function helper($name)
{
    if (strpos($name, '/') === false) {
        $name .= '/data';
    }

    $registryKey = '_helper/' . $name;
    if (!self::registry($registryKey)) {
        $helperClass = self::getConfig()->getHelperClassName($name);
        self::register($registryKey, new $helperClass);
    }
    return self::registry($registryKey);
}

您可以选择模型,因为getModel()每次调用工厂方法时都会返回一个新实例。尽管在我看来,这是一个糟糕的编程案例,也会损害你的性能。

我会选择在拨打新电话时刷新最新数据addBenchmark。如果您想将所有数据存储在帮助程序中以供以后处理,也许总是返回数组中的最新键?不过,那是选择和口味的问题,所以我将把这部分留给你。

希望这对您有所帮助!

于 2012-10-26T14:44:58.827 回答
2

添加基准密钥并制作类似

$this->benchmarks[$key]['start'] = microtime(true);
// ... 
$this->benchmarks[$key]['finish'] = microtime(true);

所以每次迭代都会有一组开始-完成对

为什么不想使用 Varien_Profiler?

Varien_Profiler::start($_profilerKey);
// ...
Varien_Profiler::stop($_profilerKey);
于 2012-10-26T14:47:02.740 回答