Php dizeleri değişmez mi?

5 Cevap php

Veya: PHP benim dize-operasyonlarını optimize mı? Ben bu konuda PHP'nin kılavuzu sormaya çalıştım, ama bir şey için herhangi bir ipucu alamadım.

5 Cevap

PHP zaten optimize - değişkenler using copy-on-write atanır ve nesnelerine başvuru tarafından geçirilir. PHP 4 bu, ama kimse yine yeni kod için PHP 4 kullanıyor olmalıdır değildir.

Birçok dilde en önemli hız optimizasyon teknikleri bir örneği yeniden olduğunu. Bu durumda hız artışı, en az 2 faktör gelmektedir:

1. Less instantiations means less time spent on construction.

2. The less the amount of memory that the application uses, the less CPU cache misses muhtemelen vardır.

Hız # 1 öncelik olduğu uygulamalar için, CPU ve RAM arasında gerçekten sıkı bir darboğaz mevcuttur. Darboğazı için nedenlerinden biri RAM gecikme.

PHP, Ruby, Python, vb, hatta RAM'de yorumlanır programlarının çalışma zamanı verilerin en azından bazıları (muhtemelen tüm) depolamak bir gerçeği ile önbellek-özlüyor ilişkilidir.

Dize örnekleme görece "büyük miktarlarda" in, oldukça sık yapılan ameliyatlardan biri olduğunu ve hız üzerinde gözle görülür bir etkisi olabilir.

Burada ölçüm deneyinin bir run_test.bash bulunuyor:

#!/bin/bash

for i in `seq 1 200`;
do
        /usr/bin/time -p -a -o ./measuring_data.rb  php5 ./string_instantiation_speedtest.php
done

. Burada / string_instantiation_speedtest.php ve ölçüm sonuçları:

<?php

// The comments on the
// next 2 lines show arithmetic mean of (user time + sys time) for 200 runs.
$b_instantiate=False; // 0.1624 seconds
$b_instantiate=True;  // 0.1676 seconds
// The time consumed by the reference version is about 97% of the
// time consumed by the instantiation version, but a thing to notice is
// that the loop contains at least 1, probably 2, possibly 4,
// string instantiations at the array_push line.
$ar=array();
$s='This is a string.';
$n=10000;
$s_1=NULL;

for($i=0;$i<$n;$i++) {
    if($b_instantiate) {
        $s_1=''.$s;
    } else {
        $s_1=&$s;
    }
    // The rand is for avoiding optimization at storage.
    array_push($ar,''.rand(0,9).$s_1);
} // for

echo($ar[rand(0,$n)]."\n");

?>

Ruby 1.8 ile yaptım bu deney ve bir diğer deney Benim vardığım sonuç bu referans etrafında dize değerlerini geçmek mantıklı olmasıdır.

Tek bir dize değiştirilmiş bir sürümünü kullanmak gerektiğinde, "pass-dizeleri-by-reference" tüm uygulama kapsamında yer almasını sağlamak için tek mümkün yolu, sürekli yeni bir dize örneği yaratmak için olduğunu.

Yerellik artırmak için, bu nedenle hızlı, tek işlenen her tüketir bellek miktarını azaltmak isteyebilirsiniz. Aşağıdaki deney dize bitiştirmelerini için davayı gösterir:

<?php

// The comments on the
// next 2 lines show arithmetic mean of (user time + sys time) for 200 runs.
$b_suboptimal=False; // 0.0611 seconds
$b_suboptimal=True;  // 0.0785 seconds
// The time consumed by the optimal version is about 78% of the
// time consumed by the suboptimal version.
//
// The number of concatenations is the same and the resultant
// string is the same, but what differs is the "average" and maximum
// lengths  of the tokens that are used for assembling the $s_whole.
$n=1000;
$s_token="This is a string with a Linux line break.\n";
$s_whole='';

if($b_suboptimal) {
    for($i=0;$i<$n;$i++) {
        $s_whole=$s_whole.$s_token.$i;
    } // for
} else {
    $i_watershed=(int)round((($n*1.0)/2),0);
    $s_part_1='';
    $s_part_2='';
    for($i=0;$i<$i_watershed;$i++) {
        $s_part_1=$s_part_1.$i.$s_token;
    } // for
    for($i=$i_watershed;$i<$n;$i++) {
        $s_part_2=$s_part_2.$i.$s_token;
    } // for
    $s_whole=$s_part_1.$s_part_2;
} // else

// To circumvent possible optimization one actually "uses" the
// value of the $s_whole.
$file_handle=fopen('./it_might_have_been_a_served_HTML_page.txt','w');
fwrite($file_handle, $s_whole);
fclose($file_handle);

?>

Bir metnin önemli miktarda içeren HTML sayfaları toplanır Örneğin, daha sonra bir oluşturulan HTML farklı parçaları bir araya concated nasıl sırayla, düşünmek isteyebilirsiniz.

Hızlı google onlar kesilebilir önermek gibi görünüyor, ama tercih edilen uygulama değişmez olarak onları tedavi etmektir.

PHP dizeleri iletmenin.

Bu deneyin:

    $a="string";
    echo "<br>$a<br>";
    echo str_replace('str','b',$a);
    echo "<br>$a";

Bu echos:

string
bing
string

Bir dize değişken olsaydı, "Bing" göstermeye devam edecekti.

Diziler ve dizeleri üzerine kopyalama-yazma davranışı. Bunlar kesilebilir, ancak bir değişkene atamak zaman başlangıçta bu değişken dize veya dizi aynı örneği içerecektir. Eğer değişiklik sadece dizi veya dize yapılan bir kopyasıdır.

Örnek:

$a = array_fill(0, 10000, 42);  //Consumes 545744 bytes
$b = $a;                        //   "         48   "
$b[0] = 42;                     //   "     545656   "

$s = str_repeat(' ', 10000);    //   "      10096   "
$t = $s;                        //   "         48   "
$t[0] = '!';                    //   "      10048   "