sembrerà una domanda demenziale, ma qual'è il più veloce tra i due per una pagina eseguita centinaia di volte al minuto?
come lavora php su una if?
legge il contenuto dell'intera porzione anche se la condizione non è vera?
e con switch?
sembrerà una domanda demenziale, ma qual'è il più veloce tra i due per una pagina eseguita centinaia di volte al minuto?
come lavora php su una if?
legge il contenuto dell'intera porzione anche se la condizione non è vera?
e con switch?
Una forte determinazione ad esser felici vi aiuterà
Prima di metterti ad "ottimizzare" due costrutti hai provveduto ad ottimizzare tutto il resto?
Se accedi ad un database, hai implementato un sistema di caching? Hai provato le connessioni persistenti?
Se generi dell'output, hai implementato un sistema di caching?
Hai rivisto gli algoritmi che utilizzi? C'è modo di migliorarne le performace?
E' realmente necessario eseguire la pagina centinaia di volte al minuto?
etc. etc.
mysql_pconnect -> yes
---------------------------------------------------------------
sistema di caching delle query ? boh!
cmq ogni pagina è 2 query molto leggere
---------------------------------------------------------------
output unico,
un solo echo finale di variabili fatte con ' '
---------------------------------------------------------------
il numero di volte purtroppo è dato dall'alto numero di utenti![]()
Una forte determinazione ad esser felici vi aiuterà
Non ci sono solo "if" o "switch".. ad esempio considera anche le seguenti possibilità:
Codice PHP:
<?php
function Action1 (){
return "Action1";
}
function Action2 (){
return "Action2";
}
function Action3 (){
return "Action3";
}
function TestActionArray ($theActionNumber){
$aActionArray = array (
"Action1",
"Action2",
"Action3",
);
return $aActionArray [$theActionNumber - 1] ();
}
function TestActionName ($theActionNumber){
$aAction = "Action".$theActionNumber;
return $aAction ();
}
function TestAction (){
echo TestActionArray (1);
echo TestActionName (2);
}
TestAction ();
?>
Certo, sopratutto quando si tratta di ottimizzare le performace:Originariamente inviato da MacApp
Non ci sono solo "if" o "switch"..
Il tuo codice risulta circa 7 volte più lento di richiamare direttamente l'IF.Codice PHP:
<pre>
<?php
function Action1 (){
echo "Action1";
}
function Action2 (){
echo "Action2";
}
function Action3 (){
echo "Action3";
}
function TestActionArray ($theActionNumber){
$aActionArray = array (
"Action1",
"Action2",
"Action3",
);
return $aActionArray [$theActionNumber - 1] ($theActionNumber);
}
function TestActionName ($theActionNumber){
$aAction = "Action".$theActionNumber;
return $aAction ($theActionNumber);
}
define('COUNT', 100000);
ob_start();
$start = microtime();
$theActionNumber = 1;
for ($i = 0; $i < COUNT; $i++) {
TestActionName($theActionNumber);
}
$time = microtime() - $start;
ob_end_clean();
echo "Did nothing in $time seconds\n";
ob_start();
$start = microtime();
$theActionNumber = 1;
for ($i = 0; $i < COUNT; $i++) {
if ($theActionNumber == 1) {
echo "Action1";
}
}
$time = microtime() - $start;
ob_end_clean();
echo "Did nothing in $time seconds\n";
?>
</pre>
I test non sono equivalenti, infatti laddove tu chiami esplicitamente in linea:Originariamente inviato da filippo.toso
Il tuo codice risulta circa 7 volte più lento di richiamare direttamente l'IF.
dovresti chiamare, per rendere equivalente il test un qualcosa del genere:Codice PHP:
for ($i = 0; $i < COUNT; $i++) {
if ($theActionNumber == 1) {
echo "Action1";
}
}
ad esempio, cosi' facendo per COUNT = 10000000 con $theActionNumber = 3, ottengo:Codice PHP:
function TestActionIf ($theActionNumber){
if ($theActionNumber == 1){
Action1 ();
}
else{
if ($theActionNumber == 2){
Action2 ();
}
else{
if ($theActionNumber == 3){
Action3 ();
}
}
}
}
for ($i = 0; $i < COUNT; $i++) {
TestActionIf ($theActionNumber);
}
codice:$ time php -f action_TestActionIf.php Test done real 0m12.119s $ time php -f action_TestActionName.php Test done real 0m14.846s
Affermando Non ci sono solo "if" o "switch" dichiari che il codice che hai postato è un'alternativa valida ad if e switch.Originariamente inviato da MacApp
I test non sono equivalenti
Ovvero sostituendo la chiamata TestActionName(1) ad un if($action == 1) si dovrebbero ottenere delle performance migliori.
Una chiamata a funzione (in verità nel caso riportato "a più funzioni"), introduce un sensibile overhead totalmente ingiustificato se il solo obiettivo era NON usare il costrutto IF().
EDIT: aggiunto il risultato per TestActionArrayOriginariamente inviato da MacApp
I test non sono equivalenti, infatti laddove tu chiami esplicitamente in linea:
dovresti chiamare, per rendere equivalente il test un qualcosa del genere:Codice PHP:
for ($i = 0; $i < COUNT; $i++) {
if ($theActionNumber == 1) {
echo "Action1";
}
}
ad esempio, cosi' facendo per COUNT = 10000000 con $theActionNumber = 3, ottengo:Codice PHP:
function TestActionIf ($theActionNumber){
if ($theActionNumber == 1){
Action1 ();
}
else{
if ($theActionNumber == 2){
Action2 ();
}
else{
if ($theActionNumber == 3){
Action3 ();
}
}
}
}
for ($i = 0; $i < COUNT; $i++) {
TestActionIf ($theActionNumber);
}
codice:$ time php -f action_TestActionIf.php Test done real 0m12.119s $ time php -f action_TestActionName.php Test done real 0m14.846s $ time php -f action_TestActionArray.php Test done real 0m14.092s
A dire il vero ho scritto scritto di "considerare anche".Originariamente inviato da filippo.toso
Affermando Non ci sono solo "if" o "switch" dichiari che il codice che hai postato è un'alternativa valida ad if e switch.
In un thread intitolato "più veloce if o switch?", posti un messaggio che inizia con "Non ci sono solo "if" o "switch".. " e poi suggerisci di considerare anche le seguenti possibilità.Originariamente inviato da MacApp
A dire il vero ho scritto scritto di "considerare anche".
Chissà cosa mi ha fatto credere che ritenessi il tuo esempio più performante dei costrutti if() e switch()...