Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc
Comunitatea PHP Romania
 

Curiozitate
Vezi mesajul original
Du-te la pagina 1, 2  Următoare
 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> Cod PHP
Subiectul anterior :: Subiectul următor  
Autor Mesaj
mihaitha



Data înscrierii: 04/Mai/2007
Mesaje: 1587
Locație: Sibiu

Trimis: Mie Ian 09, 2008 10:07 am    Titlul subiectului: Curiozitate  

Am citit o gramada de idei de optimizare a codului php, avand ca target viteza de executie, insa nicaieri nu am intalnit urmatoarea chestie:
este mai rapid codul:
<?    echo $var_bool ? 'ceva' : 'altceva'; ?>decat<?    if ($var_bool)       echo 'ceva';    else       echo 'altceva'; ?>?

Vreau sa stiu daca merita, la coduri mai solicitante, sa imi formez o obisnuinta din a folosi operatorul ?: in detrimentul unui bloc if->else. Mersi.
Sus  
dechim



Data înscrierii: 10/Mai/2005
Mesaje: 588
Locație: Drobeta Turnu Severin

Trimis: Mie Ian 09, 2008 12:26 pm    Titlul subiectului:  

Am facut testul asta :
Cod:
<?php
set_time_limit (0);
$n = 100000000;
$t1=mktime();
for ($i=1;$i<$n;$i++)
{
   $a = ($i<$n/2) ? " mic " : " mare ";
}

$t2=mktime();

for ($i=1;$i<$n;$i++)
{
   if ($i<$n/2)
   {
     $a = " mic " ;
   }
   else
   {
      $a = " mare ";
   }
}

$t3=mktime();

$dt1 = $t2 - $t1;
$dt2 = $t3 - $t2;
$ddt = $dt2 - $dt1;
echo "<br /> $dt1";
echo "<br /> $dt2";
echo "<br /> $ddt";

?>

si am obtinut:
39
37
-2
Nu-i mare diferenta !
Sus  
mihaitha



Data înscrierii: 04/Mai/2007
Mesaje: 1587
Locație: Sibiu

Trimis: Mie Ian 09, 2008 2:13 pm    Titlul subiectului:  

Hmm... vad si eu ca diferenta nu prea e... insa testul tau imi contrazice total asteptarile. Ma asteptam ca ?:, fiind operator, sa fie sensibil mai rapid decat blocul if-else... Ai facut numai un singur test sau asta e o medie statistica?
Sus  
vectorialpx



Data înscrierii: 01/Mar/2005
Mesaje: 2963
Locație: țopăi pe tasta DELETE

Trimis: Mie Ian 09, 2008 2:55 pm    Titlul subiectului:  

nu cred ca merita efortul sa te complici pentru o diferenta asa mica... o conditie e o conditie si nu ara vea rost o pierdere de timo

exemplu banal
$var = isset($var1)?$var1:(isset($bol1)?$bol1:(isset($bol2)?$bol2:''));
e cam complicat fata de o inlantuire de if-uri... [bine, in cazul meu e simplu un case dar exemplul e banal, cum ziceam]
Sus  
dechim



Data înscrierii: 10/Mai/2005
Mesaje: 588
Locație: Drobeta Turnu Severin

Trimis: Mie Ian 09, 2008 10:40 pm    Titlul subiectului:  

Am rulat de cateva ori si de cele mai multe ori nu mi-a dat diferenta.
WAMP pe Windows.
Si eu ma asteptam sa fie invers.
Sus  
gibi



Data înscrierii: 27/Iul/2007
Mesaje: 38

Trimis: Vin Ian 11, 2008 3:51 pm    Titlul subiectului:  

Este exact aceeasi treaba: si se numeste Short-form if-then-else


Cod:
<?php
if ($a > 100){
    echo ‘More than 100’;
}elseif ($a > 50){
    echo ‘More than 50’;
}else {
    echo “I don’t know what it is”;
}
?>

este identic cu

Cod:
<?php
$a = 10;
if ($a < 100):
echo ‘Less than 100’;
elseif ($a < 50):
echo ‘Less than fifty’;
else:
echo “I don’t know what it is”;
endif
?>

si este identica cu Short-form if-then-else.
Sus  
mihaitha



Data înscrierii: 04/Mai/2007
Mesaje: 1587
Locație: Sibiu

Trimis: Vin Ian 11, 2008 4:29 pm    Titlul subiectului:  

Your point? Sunt sigur ca majoritatea stiu de if(): elseif(): else: endif; Esti cam offtopic, avand in vedere ca noi discutam aici de diferenta de performanta intre blocurile if-else si operatorul ?:
Sus  
Quber



Data înscrierii: 27/Iun/2006
Mesaje: 798
Locație: localhost

Trimis: Vin Ian 11, 2008 8:07 pm    Titlul subiectului:  

@mihaitha, eu tot ma asteptam ca "?" sa fie mai rapid...!
Sus  
mihaitha



Data înscrierii: 04/Mai/2007
Mesaje: 1587
Locație: Sibiu

Trimis: Lun Ian 14, 2008 12:11 pm    Titlul subiectului:  

Quber a scris: @mihaitha, eu tot ma asteptam ca "?" sa fie mai rapid...!
Depinde cum e implementat respectivul operator la compilare in C++ (in care e scris php). Din ce am invatat asamblare, un bloc if-else e complilat de forma asta:
Cod:
if (x == 0)
   y = 1;
else
   y = 0;

devine dupa compilare:

cmp [xxxx:yyyy], 0
jez label1
jnez label2

label1:
mov [yyyy:xxxx], 1
jmp returnfromif

label2:
mov [yyyy:xxxx], 0

returnfromif:
... restul programului

Asta e varianta clasica de compilare. Ei bine, un compilator mai destept ar genera un cod mai rapid (cu un singur jump) de genul acesta:
Cod:
cmp [xxxx:yyyy], 0
jez label1
mov [yyyy:xxxx], 0
jmp returnfromif

label1:
mov [yyyy:xxxx], 1

returnfromif:
... restul programului

Probabil in php (respectiv C-ul corespunzator) e implementat if-else cu un singur jump, iar ?: cu doua (deoarece if poate aparea fara else, in timp ce ?: e clar o structura echivalenta if-else). Parerea mea. Alta explicatie nu vad.

P.S. evident, xxxx:yyyy si yyyy:xxxx reprezinta adresele la care sunt memorate variabilele x, respectiv y.
Sus  
whooper



Data înscrierii: 05/Apr/2005
Mesaje: 722
Locație: Toronto ON

Trimis: Mar Ian 15, 2008 1:37 am    Titlul subiectului:  

?:; se numeste "ternary operator" si este un fel de scurtatura [gibi, short-form e explicatia, nicidecum numele] a lui if/else.

http://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary

Nu exista nici un fel de diferenta la timpii de rulare. PHP-ul este pana la urma un limbaj interpretat, iar codul compilat (Zend Engine) este identic in ambele cazuri. Windows e un sistem "multitasking" si n-ai de unde sa stii ce-ti fac toate procesele cand rulezi diverse scripturi. In task manager poti sa-ti vezi PC-ul IDLE 98% dar restul de 2% influenteaza timpii astia pe care ii masurati voi.

Exista insa alte diferente intre variante pe care le gasiti la link-ul de mai sus.
Sus  
Quber



Data înscrierii: 27/Iun/2006
Mesaje: 798
Locație: localhost

Trimis: Mar Ian 15, 2008 8:48 am    Titlul subiectului:  

Interesant..!

Cod:
$Pina = ((7 + 1) > 7) ? 7 : ((7 + 1) < 5) ? 4 : (7 + 1);


de ce la aceasta regula imi da rezultatul 4..?
Sus  
mihaitha



Data înscrierii: 04/Mai/2007
Mesaje: 1587
Locație: Sibiu

Trimis: Mar Ian 15, 2008 9:14 am    Titlul subiectului:  

whooper a scris: Nu exista nici un fel de diferenta la timpii de rulare. PHP-ul este pana la urma un limbaj interpretat, iar codul compilat (Zend Engine) este identic in ambele cazuri. Windows e un sistem "multitasking" si n-ai de unde sa stii ce-ti fac toate procesele cand rulezi diverse scripturi. In task manager poti sa-ti vezi PC-ul IDLE 98% dar restul de 2% influenteaza timpii astia pe care ii masurati voi.
O sa fac un test mai exhaustiv ca sa imi clarific problema. Stiu si eu ca php-ul e un limbaj interpretat, dar interpretorul e compilat in C++. BTW, cati ani ai lucrat la Zend de stii ca engine-ul e identic in ambele cazuri?

P.S. ultima oara cand am verificat, si linux-ul era SO multitasking.
Sus  
vectorialpx



Data înscrierii: 01/Mar/2005
Mesaje: 2963
Locație: țopăi pe tasta DELETE

Trimis: Mar Ian 15, 2008 9:44 am    Titlul subiectului:  

quber, ai pus paranteze aiurea

$p = (7 + 1)>7 ? 7 : ((7 + 1) < 5 ? 4 : 7+1);

;)

e nevoie sa departajezi blocurile cu paranteze cand e in string sau in alt caz..
adica $pp = 'ceva '.((7 + 1)>7 ? 7 : ((7 + 1) < 5 ? 4 : 7+1)).' altceva';

poti sa observi ca avem un bloc mare si unul mai mic [care e la else - (7 + 1) < 5 ? 4 : 7+1)]
ideea e ca dupa ? sau : nu trebuie sa pui paranteze, php stie ce sa faca
Sus  
adyre



Data înscrierii: 06/Dec/2004
Mesaje: 440
Locație: Buzau

Trimis: Mar Ian 15, 2008 10:19 am    Titlul subiectului:  

Ok, dar de exemplu intre switch si if else care se pare a fi mai rapid (in cazurile in care se poate aplica switch-ul...?
Sus  
mihaitha



Data înscrierii: 04/Mai/2007
Mesaje: 1587
Locație: Sibiu

Trimis: Mar Ian 15, 2008 11:16 am    Titlul subiectului:  

Hmmm... astea in mod sigur ar trebui sa fie egale ca viteza. Nu vad cum ar putea fi compilate diferit ca sa dea diferente...
Sus  
PHPRomania Bot
Bot Member


Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google
Trimis: Mie Dec 26, 2007 7:01 pm   Titlul subiectului: Ad  

Sus  
 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> Cod PHP Du-te la pagina 1, 2  Următoare
Pagina 1 din 2


Powered by phpBB 2.0.22 © 2001, 2002 phpBB Group
Varianta în limba română: Romanian phpBB online community