Optimizare de web - tips

PEAR, Smarty, ADOdb, OOP, PHP 5, XML, UML, Şabloane de proiectare, PHP-GTK.

Moderatori: coditza, Emil, Moderatori

ThePhantom
Average Member
Mesaje: 78
Membru din: Lun Mai 28, 2007 12:19 pm

Mesajde ThePhantom » Vin Iul 09, 2010 10:32 am

Well nu stiu daca sunt tips / tricks sau benchmarking dar.. incerc si eu sa vin cu ceva nou.

Pentru:

Cod: Selectaţi tot

for (expr1; expr2; expr3)
    statement


este slow

Cod: Selectaţi tot

$tmpData = count($some_array);
for ($i = 0; $i < $tmpData; $i++)
{
}


este mai rapid

Cod: Selectaţi tot

for ($ i= 0; isset($some_array[$i]); ++$i)
{
}


mult mai rapid decat versiunile anterioare de cod.

2. echo este mai rapid decat print pentru ca este un limbaj de constructie si nu o functie.
3. foloseste

Cod: Selectaţi tot

include 'file';
// HINT: In loc de:
include ('file');
// HINT: La fel si pentru echivalentul _once


4. In loc de:

Cod: Selectaţi tot

intval($string);
// HINT: (int), (double), (float), (string) foloseste type casting
(int)$string)


5. Pentru MySQL foloseste mysql_fetch_assoc sau mysql_fetch_row dar nu mysql_fetch_array pentru ca probabil nu vei avea nevoie amandoua pentru ca de obicei vei folosesti ($array[$i] sau $array[$key].

Urmatorul exemplu:

Cod: Selectaţi tot

$array = ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10');
unset($array[6]);
for ($i = 0; array_key_exists($i, $array); $i++)
{
    echo $array[$i], "\n";
}

va face outut doar pana la 6.

Well nu stiu cat de folositoare sunt .. dar.. am pus si eu pe aici :D



Avatar utilizator
Birkoff
Senior Member
Mesaje: 6380
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Mesajde Birkoff » Mar Aug 17, 2010 2:41 am

nu e chiar un trick dar pentru cei care sunt in aceeasi situatie ca mine sa stiti cum am rezolvat...

se da un script php care genereaza un pdf (in cazul meu o factura)
cum legea impune diferentierea celor 3 exemplare prin culoare sau text, la mine scrie exemplarul 1, 2 sau 3... in rest nu e nici o diferenta...
problema apare la internet explorer si anume daca dai sa afisezi exemplarul 1 (care sa zicem are 100 biti pdf-ul generat) si apoi vrei sa afisezi exemplarul 2 (care are tot exact 100 biti singurul bit schimbat fiind din 1 in 2 la exemplar) da cum ie nu prea le are el vede ca are acelasi link si aceeasi dimensiune si il ia din cache si il afiseaza tot pe exemplarul 1...
ei ca sa se evite treaba asta am apelat la un mic truc ca sa modific dimensiunea fisierului pdf cu 1 bit in functie de exemplarul ales si astfel ie sa fie fortat sa incarce de pe server noul pdf generat...
pur si simplu daca e exemplarul 2 mai pun un spatiu, daca e exemplarul 3 pun 2 spatii in document (utilizatorul nu vede nici o diferenta in document fiind spatii albe puse dupa text) dar acele spatii fac diferenta si maresc cu 1 bit fisierul astfel ca ie nu le mai vede identice si le afiseaza cum trebuie...

problema am intampinat-o doar pe ie si doar la documente pdf de dimensiune identica si cu acelasi link (script generat din fpdf)
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

Pirahna
Senior Member
Mesaje: 5985
Membru din: Dum Aug 22, 2004 2:04 am
Localitate: la birou
Contact:

Mesajde Pirahna » Mar Aug 17, 2010 8:49 am

ThePhantom scrie:este slow

Cod: Selectaţi tot

$tmpData = count($some_array);
for ($i = 0; $i < $tmpData; $i++)
{
}


este mai rapid

Cod: Selectaţi tot

for ($ i= 0; isset($some_array[$i]); ++$i)
{
}


mult mai rapid decat versiunile anterioare de cod.


Hmm ... eu stiam ca e cu count mai rapid, asa ca m-am luat sa fac niste teste.

Am facut un array pentru test:

Cod: Selectaţi tot

$array = array();
for($i=0;$i<100000;$i++){
   $array[$i] = rand(0,15);   
}
$array2 = $array;
$array3 = $array;
$array4 = $array;
$new_array = array();
$new_array2 = array();
$new_array3 = array();


Si apoi codurile:

count, fara instructiuni

Cod: Selectaţi tot

$count = count($array2);
for($i=0;$i<$count;++$i){
}

0.007409 sec


isset, fara instructiuni

Cod: Selectaţi tot

for($i=0;isset($array3[$i]);++$i){   
}

0.007657 sec



count, cu instructiuni echo $i

Cod: Selectaţi tot

$count = count($array2);
for($i=0;$i<$count;++$i){
echo $i;
}

0.13779 sec


isset, cu instructiuni echo $i

Cod: Selectaţi tot

for($i=0;isset($array3[$i]);++$i){
echo $i;   
}

0.14245 sec



count, cu new array

Cod: Selectaţi tot

$count = count($array2);
for($i=0;$i<$count;++$i){
   $new_array[] = $i;
}

0.03195 sec


isset, cu new array

Cod: Selectaţi tot

for($i=0;isset($array3[$i]);++$i){   
   $new_array2[] = $i;
}

0.03234 sec

O problema ar fi daca dai unset undeva pe la jumatatea array-ului, isset o sa se opreasca acolo, iar count o sa continue dar o sa iti traga un notice in zona aia (si nu o sa ajunga la ultimul element).

Aparent cea mai buna solutie ramane while:

for count, cu new array

Cod: Selectaţi tot

$count = count($array2);
for($i=0;$i<$count;++$i){
   $new_array[] = $array2[$i];
}

0.03009 sec


for isset, cu new array

Cod: Selectaţi tot

for($i=0;isset($array3[$i]);++$i){   
   $new_array2[] = $array3[$i];
}

0.03015 sec



while count, cu new array

Cod: Selectaţi tot

$count = count($array4);
$i = 0;
while($i<$count){   
$new_array3[] = $array4[$i];
++$i;
}

0.02887 sec


while isset, cu new array

Cod: Selectaţi tot

$count = count($array4);
$i = 0;
while($i<$count){   
$new_array3[] = $array4[$i];
++$i;
}

0.02899 sec


Ce e foarte util de retinut este ca $i++ este mai slow ca ++$i.

E posibil ca faptul ca generez un array mai sus sa influenteze rezultatele. De asta am incercat sa fac treaba cu $array2 si $array3, ca sa incerc sa-l fac sa uite ca are 100.000 de rezultate.
Ce vreau sa zic e ca ... cu isset o sa fie mult mai slow, pentru ca verifica la fiecare element daca e setat si daca nu e null, fata de count la care verifica la un rezultat daca un numar e mai mic ca altul.
Diferenta mare o sa fie faptul ca folosind count el stie deja cati itemi are array-ul.


Poti sa testezi si tu daca vrei. Timpii afisati de mine aici sunt timpi medii, calculati din 20 de load-uri, si folosesc cifre mari (100.000, 1.000.000) ca sa fie mai clare rezultatele.

Avatar utilizator
Birkoff
Senior Member
Mesaje: 6380
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Mesajde Birkoff » Vin Iun 03, 2011 9:06 pm

am dat de un articol cu cateva sugestii de optimizare a codului Google – Hai să facem web-ul mai rapid în PHP
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

Avatar utilizator
Birkoff
Senior Member
Mesaje: 6380
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Mesajde Birkoff » Vin Noi 18, 2011 5:26 pm

Cod: Selectaţi tot

$a = 0;
switch ($a) {
    case 'value':
        echo 'value';
        break;
    case 'no-value':
        echo 'no-value';
        break;
    default:
        echo 'stuff';
}

Asa ceva face echo 'value' pentru ca switch e un wrapper peste if, ifelse iar in traducere ar fi
if ($a == 'value')
adica
if (0 == 'value')
adica, multumita unui type conversion intern si stralucit
(int)'value' === 0

(tot asa (int)'123asda' === 123)

In concluzie, 2 comportamente cunoscute (switch si conversion) combinate dau ceva putin neasteptat.
Atentie ce var types comparati cu switch.

[offtopic]
descoperirea nu imi apartine, doar am preluat si am pus aici ca sa stie si altii problema...
in comentariile de pe php.net la swtich scrie despre problema de mai sus, deci e bine sa cititi pe langa manual si comentariile...
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.


Înapoi la “PHP Avansat”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 7 vizitatori