быстрее использовать array_keys () в forem statemnt или установить значение переменной, которая никогда не используется? - PullRequest
18 голосов
/ 11 января 2012

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

// Set a variable each iteration which is unused.
foreach ($array as $key => $value) {
  $array[$key]['foo'] = 'bar';
}

// Call array_keys() before iterating.
foreach (array_keys($array) as $key) {
  $array[$key]['foo'] = 'bar';
}

Ответы [ 3 ]

13 голосов
/ 11 января 2012

Я думаю, это также сработает и может быть быстрее:

foreach ($array as &$value) {
  $value['foo'] = 'bar';
}

ОБНОВЛЕНИЕ: Я сделал небольшой тест, и кажется, что это быстрее. http://codepad.org/WI7Mtp8K

2 голосов
/ 11 января 2012

Оставляя в стороне, что второй пример придуман. То есть, как отметили Эшли Бэнкс , зачем вам это делать ?

Первый пример будет более производительным из двух. У второй накладные расходы при вызове дополнительной функции array_keys().

Проверьте PHP Benchmark для дополнительных тестов производительности. Если вы сомневаетесь, сравните это с microtime().

1 голос
/ 20 декабря 2015

Люди должны прекратить расставлять приоритеты, ставя под сомнение мотив ОП.

Я провел простой микротайм-тест и почти не заметил заметной разницы во времени выполнения.

Способ - создание тест-массива:

$arr = array();
for($i = 0; $i<10000; $i++){
    $arr[] = mt_rand(0, PHP_INT_MAX);
    //NOTE: I also tested setting values in random keys, no measurable difference
}

Затем используйте этот массив для тестирования:

//Method 1
$start = microtime(true);
foreach(array_keys($arr) as $k){
    $arr[$k] = 0; //Do something
}
$end = microtime(true);
echo 'we spent '.($end - $start).' seconds doing this.';

Вот код для тестирования другого метода (запускался отдельно или результаты менялись еще больше)

//Method 2
$start = microtime(true);
foreach($arr as $k => $v){
    $arr[$k] = 0; //Do something
}
$end = microtime(true);
echo 'we spent '.($end - $start).' seconds doing this.';

Мое время было около 2 миллисекунд для обоих. Я полагаю, что моя система недостаточно стабильна для последовательных измерений микросекунд. Я не мог определить, был ли один быстрее другого.

Я также протестировал выполнение каждого foreach 1000 раз с меньшим массивом для измерения самого метода, но я только что получил тот же результат за 2 миллисекунды.

Так что это значит? Основываясь на этих простых тестах, выбор метода не имеет смысла в отношении производительности. Возможно, вы можете измерить крошечное улучшение одним методом по сравнению с другим, если вы используете чрезвычайно большие массивы в чрезвычайно стабильных системах или выполняете очень много циклов foreach в одну сторону в другую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...