1

このように呼び出しているカスタム ヘルパー クラス モジュールを作成しました。

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

これにより、時間ベンチマークの結果が配列で出力されます。

このクラスは非常に単純です。基本的には、配列に current を追加し、が呼び出さmicrotime()れたときにその配列を吐き出すだけです。logResults()

問題は、上記のコードを呼び出すループがありますが、ループごとに「新鮮な」ベンチマーク数値のセットをログに記録する代わりに、それ自体が複合化し、既存のベンチマーク配列に追加されていることです!

Mage::helper('benchmark');が呼び出されるたびに、新しい一連のベンチマークを作成したいと考えています。

どんな助けでも大歓迎です。

4

2 に答える 2

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 に答える
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 に答える