ホームページ  >  記事  >  php教程  >  PHP 5.4 では、Arnaud による三項式の最適化スキームが導入されました。

PHP 5.4 では、Arnaud による三項式の最適化スキームが導入されました。

WBOY
WBOYオリジナル
2016-06-21 08:52:53848ブラウズ

PHP が変数コピーのパフォーマンスを最適化するためにコピーオンライトを使用していることは誰もが知っていますが、以前の 3 項では、オペランドが大きな配列である場合、毎回コピーされていました。

$a = range(1, 1000);
$i = 0;

$start = microtime(true);
while (++$i $b = isset($a)? $a : NULL;
}

var_dump(microtime(true) - $start);
比較すると、if-else を使用して同じ機能を実行します。

$a = range(1, 1000);
$i = 0;

$start = microtime(true);
while (++$i if (isset($a)) {
$b = $a;
} else {
$b = NULL;
}
}
var_dump(microtime(true) - $start);
私のマシンでは、前者の実行時間は float(0.0448620319366) ですが、if-else を使用すると float(0.000280006027222)
になります。

このため、Arnaud は、3 項式が毎回オペランドをコピーしないように、3 項式を最適化するパッチを提供しました。最適化後、最初に示した例の実行時間は float(0.00029182434082031)

に短縮されました。

三項演算子は常に 2 番目または 3 番目のオペランドをコピーします。これは非常に

オペランドが配列の場合、if/else に比べて遅くなります。例:

$a = range(0,9);

// ここでは 0.3 秒かかります:

for ($i = 0; $i if (true) {
$b = $a;
} else {
$b = $a;
}
}
// これには 3.8 秒かかります:

for ($i = 0; $i $b = true ? $a : $a;
}
可能な限りコピーを避けることで、パフォーマンスへの影響を軽減しようとしました

(パッチが付いています)。

ベンチマーク:

パッチなし: (数値はコードの実行にかかる時間です

回数)

$int = 0;

$ary = array(1,2,3,4,5,6,7,8,9);

本当ですか? 1 : 0 0.124

true ? 1+0 : 0 0.109
true ? $ary : 0 2.020 !
true ? $int : 0 0.103
true ? ${'ary'} : 0 2.290 !
true ?: 0 0.091
1+0 ?: 0 0.086
$ary ?: 0 2.151 !
${'var'} ?: 0 2.317 !

パッチ付き:

本当ですか? 1 : 0 0.124

true ? 1+0 : 0 0.195
true ? $ary : 0 0.103
true ? $int : 0 0.089
true ? ${'ary'} : 0 0.103
true ?: 0 0.086
1+0 ?: 0 0.159
$cv ?: 0 0.090
${'var'} ?: 0 0.089

ただし、配列コピーのオーバーヘッドは解消されますが、一部の

では速度が低下します。 ケースの一部はありますが、全体としては、
のように完全に予期しないパフォーマンスの影響はありません。 現在もそうなっています。

ただし、注意してください: PHP 5.4 はまだ開発段階にあり、最終リリース前に新機能が調整または変更される可能性があります。ご提案があれば、PHP の改善に役立つフィードバックを歓迎します。

ありがとうございます



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。