[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: FOREACH vs FOR
yurayu92
что быстрее работает для перебора значений
цикл for или же все таки foreach?

Давно интересует этот вопрос и ответ я на него не нашел:(



Спустя 11 минут, 29 секунд (20.04.2012 - 13:18) Guest написал(а):
это 2е разные функции и каждая используется в КОНКРЕТНО ПОДХОДЯЩЕЙ ситуации
вопрос сродни что лучше камаз или легковой автомобиль.
Обе фунеции нужны, которая удобнее ту и используй. А сравнения скоростей - абсурдно в данном вопросе, просто несущественная разница

Спустя 6 минут, 8 секунд (20.04.2012 - 13:24) Renden написал(а):
yurayu92
For быстрее..

Спустя 1 минута, 21 секунда (20.04.2012 - 13:26) dadli написал(а):
yurayu92
настолко я знаю, foreach бистрее, но не значително, разница очен маленкая и он видимо толко на работе очен балших масивах

Спустя 3 минуты, 32 секунды (20.04.2012 - 13:29) Guest написал(а):
Забиваете голову хернёй. Что надо то и юзайте. Это 2 РАЗНЫЕ "функции"
Лично я в силу своего проекта юзаю 199 раз форич и 1 раз фор, когда явно нужен инкримент, но такое бывает невероятно редко

Спустя 1 час, 39 минут, 18 секунд (20.04.2012 - 15:09) inpost написал(а):
foreach - для перебора массива, и только его. Выполняя свою конкретную задачу, которую делает быстрее, для этого она и индивидуальна!

Спустя 17 часов, 16 минут, 39 секунд (21.04.2012 - 08:25) Эли4ка написал(а):
inpost
как раз по теме
Мне нужно перебрать два массива,но как это можно сделать с foreach?Два foreach использовать не получится..лишние данные получаются..

Спустя 38 минут, 36 секунд (21.04.2012 - 09:04) T1grOK написал(а):
Цитата (Эли4ка @ 21.04.2012 - 06:25)
inpost
как раз по теме
Мне нужно перебрать два массива,но как это можно сделать с foreach?Два foreach использовать не получится..лишние данные получаются..

Что значит лишние?! Правильно именуй переменные и они не будут казаться лишними.

А вообще по теме, равносильно спрашивать, что лучше 2+1 или 1+2). Я использую где только возможно foreach. И меня не волнует кто быстрее for или foreach. Есть более важные места которые ощутимо влияют на производительность приложения, такие как выборка из базы, оптимальное построение запросов и т.д.

Спустя 40 минут, 46 секунд (21.04.2012 - 09:45) glock18 написал(а):
Цитата (Renden @ 20.04.2012 - 11:24)
yurayu92
For быстрее..


Цитата (dadli @ 20.04.2012 - 11:26)
yurayu92
настолко я знаю, foreach бистрее, но не значително, разница очен маленкая и он видимо толко на работе очен балших масивах


еще версии? laugh.gif

yurayu92, я так понимаю сразу после получения на этот вопрос, последуют: "что лучше print или echo" и "что лучше - конкатенация или in-string variables". и то, и другое, и данный топик - банальнейший холивар, не заслуживающий даже 5 минут раздумья на эту тему. даже при том что concat vs in-string vars имеет и более веские доводы против одного из методов, чем удобство, мизерная прибавка в скорости или иные эфемерные плюсы и минусы

Спустя 33 минуты, 49 секунд (21.04.2012 - 10:18) Dezigo написал(а):
FOR пробегает по масиву (индексам)
FOREACH - когда пробегает создаёт копию массива

$array = array("test","apple");

foreach($array as $v) {
$v = "YRA!";
}


чтобы работало быстрее и передовалось значение по ссылкам надо писать

foreach($array as &$v) {
$v = "YRA";
}

Поэтому FOR быстрее.

Спустя 7 минут, 49 секунд (21.04.2012 - 10:26) vagrand написал(а):
Давненько я тестил и вроде как самый быстрый способ цикла это while

Спустя 23 минуты, 32 секунды (21.04.2012 - 10:50) glock18 написал(а):
Dezigo
vagrand
я видел ни один тест, где foreach был быстрее

Спустя 19 минут, 58 секунд (21.04.2012 - 11:10) Dezigo написал(а):
glock18 покажи тест

Спустя 37 минут, 52 секунды (21.04.2012 - 11:48) glock18 написал(а):
Цитата (Dezigo @ 21.04.2012 - 09:10)
glock18 покажи тест


ну, ты ведь не думаешь, что я запоминаю, где подобная чушь лежит

чего там показывать. напиши свой самый простенький, и увидишь, что погрешность вычислений слишком велика для того, чтобы объективно оценить что из этого быстрее.

Ты рассуждает логически верно, но есть "но", как всегда:
1. в пыхе передача параметра по ссылке работает через заднее место из-за его отложенного копирования, и поэтому по ссылке вообще не рекомендуется передавать что-либо, если только не предполагается изменение значения по ссылке.

пример на память:

$a = 10;
$b = $a;

foo($b);

function foo(&$a)
{
echo $a;
}

здесь из-за передачи по ссылке и отложенного копирования при вызове foo() будет, как это ни парадоксально на первый взгляд, значение будет скопировано. А если точнее, то произойдет разделение значений $a и $b.

И вообще, очень полезная практика передачи по ссылке в других языках программирования в пыхе приобрела какой-то извращенный вид, увы.

В итоге получается, что пых дурит головы тем, кто привык мыслить по-нормальному, не вникая в его "закидоны".

И потому я, прекрасно понимая то, что если без создания копий значения приложение должно работать быстрее, не берусь утверждать то же самое касательно пыха, и вам тоже не советую этого делать. А потому while/for/foreach, если не показывают устойчивых расхождений в результатах, для меня абсолютно одинаковы.

Спустя 3 минуты, 25 секунд (21.04.2012 - 11:51) Эли4ка написал(а):
T1grOK
мне надо разложить сразу два массива одновременно,а если я поочередно это делаю,то сначала первый массив,потом второй и первый массивы вместе..

Спустя 3 минуты, 27 секунд (21.04.2012 - 11:54) glock18 написал(а):
Dezigo
вот, наскорую руку слабал тестик потребления памяти для проверки, что там где копируется:

$arr = range(1, 100000);

printf("%70s %s\n", 'Initial memory usage:', memory_get_usage());

// for
$size = sizeof($arr);
$mem = 0;
for ($i = 0; $i < $size; $i++)
{
$mem = max(memory_get_usage(), $mem);
}

unset($size);

printf("%70s %s\n", '(For) max memory allocated:', $mem);

// foreach
$mem = 0;
foreach ($arr as $i)
{
$mem = max(memory_get_usage(), $mem);
}

printf("%70s %s\n", '(Foreach, no reference usage) max memory allocated:', $mem);

$mem = 0;
foreach ($arr as &$i)
{
$mem = max(memory_get_usage(), $mem);
}
unset($i);

printf("%70s %s\n", '(Foreach, reference usage) max memory allocated:', $mem);


лучше смотреть исходник страницы или через консоль выполнять. результаты малость удивили, пробовал for ставить 1м, 2м и 3м, и везде он потребляет порядка 112 байт больше, чем любой из форичей. А подтверждением моих слов выше, оба форича потребляют одинаково памяти.

Спустя 1 день, 11 часов, 12 минут, 44 секунды (22.04.2012 - 23:07) killer8080 написал(а):
Глупости это все. Для работы с массивами только foreach. Каждому инструменту свое назначение, и дело тут даже не в мнимом быстродействии (хотя foreach однозначно быстрей), а в том, что for в php не предназначен для работы с массивами и использовать его для этих целей не корректно, и грозит подводными камнями.

Спустя 1 час, 10 минут, 1 секунда (23.04.2012 - 00:17) I++ написал(а):
Цитирую сам себя:

Цитата
Свернутый текст
// Способ №1. Простой foreach без ключа
foreach ($array as $item){
    $summ += $item;
}
// Способ №2. Foreach с выборкой ключа
foreach ($array as $key=>$item){
    $summ += $item;
}
// Способ №3. Foreach с получением значения по ссылке
foreach ($array as $key=>&$item){
    $summ += $item;
}
// Способ №4. Цикл For и функция next()
$summ = current($array);
for ($i = 0; $i < $size; $i++){
    $summ += next($array);
}
//Способ №5. While и функция each()
while (list($key, $value) = each($array)){
    $summ += $value;
}
//Способ №6. Обычный For
for ($i=0; $i<$count; $i++){
    $summ += $array[$i];
}

Способ №1. Простой foreach без ключа  0.112 с
Способ №2. Foreach с выборкой ключа  0.131 с
Способ №3. Foreach с получением значения по ссылке  0.144 с
Способ №4. Цикл For и функция next()  0.383 с
Способ №5. While и функция each()  1.180 с
Способ №6. Обычный For  0.120 с


Все зависит от конкретной ситуации применения, это раз, во 2 если Вы пишите приложение критичное к производительности, юзаем Vulcan Logic Disassembler, смотрим опкоды, меньшее количество опкодов лучше, но это не значит, что оно быстрее, все зависит от того как реализовано на С++ это.

Плюс оптимизированное приложение будет воркать с предсказуемым результатом, только на той версии php под которую писали. А если не виндоус, что скорее всего, то апдейты каких либо реквайров помимо основного php может устроить чудо всей оптимизации.

Оптимизации не зло, просто нужно рационально подходить к вопросу, а не оптимизировать любое хеллоу ворлд приложение и тратить на разработку кучу времени.

Спустя 8 часов, 14 минут, 20 секунд (23.04.2012 - 08:32) killer8080 написал(а):
Дело не в том, что быстрее, а чем грозит неправильное использование инструмента.
Простой пример
$arr = range(1, 5);
$count = count($arr);
for($i = 0; $i < $count; $i++){
echo $arr[$i];
}

вроде все нормально, на выходе получили 12345, как и ожидалось
Усложняем задачу
$arr = range(1, 5);
unset($arr[3]);
$count = count($arr);
for($i = 0; $i < $count; $i++){
echo $arr[$i];
}

и что же мы видим, вместо ожидаемого вывода 1235, получили 123 и нотис user posted image
а все потому, что count() не годится для определения последнего индекса массива в общем случае. При её использовании нужно всегда быть уверенным, что из массива ничего не удалялось, его не прогоняли через array_filter() и т.п. Исправляем баг
$arr = range(1, 5);
unset($arr[3]);
$count = max(array_keys($arr)) + 1;
for($i = 0; $i < $count; $i++){
if(!isset($arr[$i])) continue;
echo $arr[$i];
}

Итого, что мы имеем, бессмысленное усложнение кода, порождаем ненужные переменные, создаем массив из ключей, проходим по нему в поисках максимального значения (что по сути уже цикл), на каждой итерации делаем дополнительную проверку, на существование офсета, и все ради чего?
Ну и наконец последний гвоздь в гроб for, вопрос на засыпку - сколько итераций проделает for, чтоб перебрать массив из 3-х элементов? user posted image
$arr = array(0 => 'a', 1 => 'b', 10000000 => 'c');
$count = max(array_keys($arr)) + 1;
for($i = 0; $i < $count; $i++){
if(!isset($arr[$i])) continue;
echo $arr[$i];
}


Каждому инструменту, свое назначение, если разработчики нам предоставили специализированный инструмент, для решения задачи, то его и нужно использовать.

PS про то что в массиве могут быть еще и ассоциативные ключи я промолчу.

Спустя 22 часа, 18 минут, 47 секунд (24.04.2012 - 06:50) Эли4ка написал(а):
killer8080
а можно как-нибудь два массива разложить за один foreach ?

Спустя 1 час, 4 минуты, 54 секунды (24.04.2012 - 07:55) killer8080 написал(а):
Цитата (Эли4ка @ 24.04.2012 - 07:50)
killer8080
а можно как-нибудь два массива разложить за один foreach ?

Что ты имеешь ввиду?

Спустя 13 минут, 57 секунд (24.04.2012 - 08:09) glock18 написал(а):
Цитата (killer8080 @ 24.04.2012 - 05:55)
Что ты имеешь ввиду?

что-то типа этого


$arr1 = array(1 => 1, 2 => 2, 3 => 3);
$arr2 = array(1 => 'a', 2 => 'b', 3 => 'c');

foreach ($arr1 as $key => $value)
{
echo $arr1[$key] . ' - ' . $arr2[$key] . "<br />\n";
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.