PHP の for ループと foreach ループのパフォーマンスと可読性

[forループとforeachループと範囲]

for10 万回以上の反復でループとforeachループを比較しましたrangeテスト結果は、ループの実行がループforよりもforeach高速であることを示しています。

その理由は、forループが整数値をインクリメントすることによって比較を実行するためです。対照的に、foreachおよび はrange、各要素を抽出して配列の終わりをチェックする前に、配列を作成する必要があります。

<?php
	$time_one = microtime(true);
	for ($i=0; $i < 100000; $i++) {
    
    
		# code...
	}
	echo 'For loop: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;

	echo "<br />";

	$time_two = microtime(true);
	foreach (range(0, 100000) as $i) {
    
    
		# code...
	}
	echo 'Foreach + range loop: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>

出力:

For loop: 0.001291036605835 s
Foreach + range loop: 0.00661301612854 s

[サフィックスとプレフィックスの増分を含むループfor]

時間差が重要な場合は、前置増分を使用したループの方がfor後置増分を使用したループよりもfor高速に実行されることを知っておく必要があります。

これは、サフィックスは 1 つインクリメントする前に前の値のコピーを保持するのに対し、プレフィックス インクリメントは前の値のコピーを保持せずに 1 を追加するためです。

例:

<?php
	$time_one = microtime(true);
	for ($i=0; $i < 100000; ++$i) {
    
    
		# code...
	}
	echo 'For loop with prefix $i: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;

	echo "<br />";

	$time_two = microtime(true);
	for ($i=0; $i < 100000; $i++) {
    
    
		# code...
	}
	echo 'For loop with postfix $i: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>

出力:

For loop with prefix $i: 0.0012187957763672 s
For loop with postfix $i: 0.0031270980834961 s

[count関数付きループfor]

count関数を含むループは、for関数を持たないループよりも高速に実行されます。

count以下のコード ブロックで 2 つのテストを実行しました。最初のテストは関数を使用したループを使用しfor、2 番目のテストは関数を使用countせずに配列内の要素の数を使用しました。

例:

<?php
	$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];

	$time_one = microtime(true);
	for ($i=0; $i < count($myArray); $i++) {
    
    
		# code...
	}
	echo 'For loop with count function: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;

	echo "<br />";

	$time_two = microtime(true);
	for ($i=0; $i < 10; $i++) {
    
    
		# code...
	}
	echo 'For loop without count function: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>

出力:

For loop with count function: 6.9141387939453E-6 s
For loop without count function: 9.5367431640625E-7 s

【鍵なしforeach・鍵ありforeach

キーを使用しないループは、キーと値を使用するforeachループよりも高速に実行されます。foreach

以下のコード スニペットには 10 個の要素の配列があり、foreach配列に対してループを実行します。最初の実行ではキーが使用されませんが、2 回目の実行ではキーと値が使用されます。

例:

<?php
	$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];

	$time_one = microtime(true);
	foreach ($myArray as $value) {
    
    
		# code...
	}
	echo 'Foreach loop without key: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;

	echo "<br />";

	$t01 = microtime(true);
	foreach ($myArray as $key => $value) {
    
    
		# code...
	}
	echo 'Foreach loop with key and value: ' . (microtime(true) - $t01) . ' s', PHP_EOL;
?>

出力:

Foreach loop without key: 0.00055599212646484 s
Foreach loop with key and value: 9.5367431640625E-7 s

[count関数forとキーと値を使用したループforeach]

(foreachキーと値を使用した)for間の 10 個の要素の配列に対して関数を使用してcountテストし、キーと値を使用した方がforeachカウント関数を使用した場合よりも優れていることがわかりました。

例:

<?php
	$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];

	$time_one = microtime(true);
	for ($i=0; $i < count($myArray); $i++) {
    
    
		# code...
	}
	echo 'For loop with count: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;

	echo "<br />";

	$time_two = microtime(true);
	foreach ($myArray as $key => $value) {
    
    
		# code...
	}
	echo 'Foreach loop with key and value: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>

出力:

For loop with count: 8.1062316894531E-6 s
Foreach loop with key and value: 2.1457672119141E-6 s

[キーありcountforeachキーforなしのループ]

count関数を使用したサイクルforとキーを使用しないサイクルforeachは同じ速度で実行されます。

<?php
	$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];

	$time_one = microtime(true);
	for ($i=0; $i < count($myArray); $i++) {
    
    
		# code...
	}
	echo 'For loop with count: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;

	echo "<br />";

	$time_two = microtime(true);
	foreach ($myArray as $value) {
    
    
		# code...
	}
	echo 'Foreach loop without key: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>

出力:

For loop with count: 9.5367431640625E-7 s
Foreach loop without key: 9.5367431640625E-7 s

[countfor範囲を使用したループforeach]

count を使用したループはfor、 range を使用したループよりもforeach高速に実行されます。

<?php
	$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];

	$time_one = microtime(true);
	for ($i=0; $i < count($myArray); $i++) {
    
    
		# code...
	}
	echo 'For loop with count: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;

	echo "<br />";

	$time_two = microtime(true);
	foreach (range(0, 10) as $i) {
    
    
		# code...
	}
	echo 'Foreach loop with range: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>

出力:

For loop with count: 1.0013580322266E-5 s
Foreach loop with range: 3.0994415283203E-6 s

Web ブラウザでコード例を実行すると、異なるタイミング結果が得られることに注意してください。上記のコード例はすべて、PHP 8.1.2 を使用して Windows 10 で実行しました。

[forループとforeachループの可読性 ]

for読みやすさの点では、ループよりもループの方が読みやすいことがわかりますforeachこれは、forforループでは、より大きな数よりも小さなカウンタを比較していることがわかるためです。

range で使用する場合は、ループ内で関数の目的を推測するforeach必要があります。foreachrange

おすすめ

転載: blog.csdn.net/weixin_50251467/article/details/131777355