Какой из них будет лучше для производительности и удобочитаемости?
foreach(range(0,10000) as $i) {} // 3.847 ms for($i = 0; $i < 10000; ++$i) {} // 0.663 ms
Изменить : Был ли тест и последний был почти в 6 раз быстрее.
Традиционная for
цикла быстрее, чем foreach
+ range
. Первый использует только целочисленное сравнение и увеличение, в то время как последний должен создать (возможно большой) массив, а затем извлечь каждый элемент, перемещая курсор внутреннего массива и проверяя, достигнут ли конец.
Если вы выполните это, вы увидите, что обычная точка for
два раза быстрее, чем foreach
+ range
:
$t0 = microtime(true); for ($i = 0; $i < 100000; $i++) { } echo 'for loop: ' . (microtime(true) - $t0) . ' s', PHP_EOL; $t0 = microtime(true); foreach (range(0, 100000) as $i) { } echo 'foreach + range loop: ' . (microtime(true) - $t0) . ' s', PHP_EOL;
Лучше использовать традиционную for
привычки в случае, если вам нужно повторять определенное количество раз, но в конце дня вы не увидите больших улучшений производительности в большинстве сценариев (учтите, что приведенный выше пример повторяет 100k раз, если вы уменьшаете количество итераций, разница меньше).
Если это так важно,
for($i = 0; $i < 1000; ++$i) {}
быстрее, чем
for($i = 0; $i < 1000; $i++) {}
но вы не заметите большой разницы всего за 1000 итераций
Действительно ли это так важно для микро-оптимизации … и если да, почему бы вам просто не настроить некоторые тестовые прогоны, чтобы сравнить различные варианты самостоятельно
Foreach
отлично подходит для повторения массивов с использованием ключей и значений.
Например, если у меня был массив с именем «Пользователь»:
$User = array( 'name' => 'Bob', 'email' => 'bob@example.com', 'age' => 200 );
Я мог легко и быстро прокручивать и использовать ключи:
foreach ($User as $key => $value) { echo $key.' is '.$value.'<br />'; }
Это напечатает:
name is Bob email is bob@example.com age is 200
Для циклов с петлями сложнее сохранить ключи.
Когда вы используете объектно-ориентированную практику в PHP, вы обнаружите, что вы будете использовать foreach
почти целиком, for
циклов только для численных или списковых вещей. foreach
также не позволяет вам использовать count($array)
чтобы найти общее количество элементов в массиве.
Foreach отлично подходит для повторения массивов с использованием ключей и значений. Для циклов с петлями сложнее сохранить ключи. http://www.c-sharpcorner.com/interviews/answer/2147/ это может быть полезно
В этом конкретном случае (с range()
а не с массивом, переданным из другой области) – foreach()
будет быстрее. for()
будет бить его практически в любом другом случае.
сравнение скорости выполнения некоторых php-функций
для цикла
for()
using count()
занимает 20.86401 мс
for()
Без Not using count()
7.09796 мс
используя count () означает: for ($i = 1; $i < count($myarr); ++ $i) {
..
где как foreach () loop:
foreach()
занял 11.16920 мс
foreach()
с KEY занял 12.35318 мс
они оба выполняются на одном массиве, и их соответствующее время выполнения показано как for
foreach
так и foreach
– это языковые конструкции, и их скорость выполнения будет больше, поэтому вы не можете заметить гораздо больше различий, если не используете их в массиве с тысячами записей.