| 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 |
|
| |