Dizi klonlama performansı

3 Cevap php

Hepimiz biliyoruz ki

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

Ancak, ne ben okurken hatırlıyorum, ama Googling tarafından teyit edemez, dizi değiştirilmeden kadar içten, kopyalanamaz değil, olmasıdır.

$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

Bu doğruysa ben merak ediyorum. Eğer öyleyse, bu iyi olurdu. Büyük bir dizi etrafında bir sürü geçerken performansını artırmak, ama sadece (bir kez oluşturduktan sonra) yine ondan okuma olacaktır.

3 Cevap

Bu bilmek istedim daha fazla olabilir, ama this article değişkenleri PHP çalışacak şekilde iyi bir açıklamasını verir olabilir.

Genel olarak, bu kesinlikle gerekli kadar değişkenler kopyalanamaz olmadığı doğru.

Ben bunu doğruladı gibi görünüyor:

<?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');

Verir:

Create: 0.0956180095673
Copy: 7.15255737305E-6
Modify: 0.0480329990387

Burada doğru olduğuna inanıyoruz. ... Ben bu konuda bir şey bulamıyorum ben bu konuda belgeleri bulmak için çalışacağız, ama ben bir yerde okudum eminim. Umarım burada birileri belgelere bulma daha iyi bir şans olacaktır.