производительность клонирования массива - PullRequest
3 голосов
/ 02 апреля 2009

Мы все знаем, что

$a1 = array('foo');
$a2 = $a1;
$a2[0] = 'bar';
// now $a1[0] is foo, and $a2[0] is bar. The array is copied

Однако, что я помню, читая, но не могу подтвердить с помощью Google, это то, что массив внутренне не копируется, пока не будет изменен.

$a1 = array('foo');
$a2 = $a1; // <-- this should make a copy
// but $a1 and $a2 point to the same data internally
$a2[0] = 'bar';
// now $a1[0] is foo, and $a2[0] is bar. The array is really copied

Мне было интересно, правда ли это. Если так, это было бы хорошо. Это увеличит производительность при многократной передаче большого массива, но только при чтении из него (после его создания один раз).

Ответы [ 3 ]

5 голосов
/ 02 апреля 2009

Это может быть больше, чем вы хотели знать, но эта статья дает хорошее описание того, как переменные работают в PHP.

В общем, вы правы, что переменные не копируются до тех пор, пока это не станет абсолютно необходимым.

1 голос
/ 02 апреля 2009

Кажется, я это подтвердил:

<?php

ini_set('memory_limit', '64M');

function ttime($m) {
    global $s;
    echo $m.': '.(microtime(true) - $s).'<br/>';
    $s = microtime(true);
}

function aa($a) {
    return $a;
}

$s = microtime(true);
for ($i = 0; $i < 200000; $i++) {
    $array[] = $i;
}
ttime('Create');
$array2 = aa($array); // or $array2 = $array
ttime('Copy');
$array2[1238] = 'test';
ttime('Modify');

Дает:

Create: 0.0956180095673
Copy: 7.15255737305E-6
Modify: 0.0480329990387
0 голосов
/ 02 апреля 2009

Я верю, что вы правы здесь. Я попытаюсь найти документацию по этому вопросу ... Я ничего не могу найти по этому поводу, но я уверен, что я где-то читал. Надеюсь, кому-то здесь повезет с поиском документации.

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