Newsgroup: it.comp.www.php
Titolo: Prestazioni: session o variabile?

Salve,
Mi è venuto questo dubbio: in una sola pagina php è meglio utilizzare
più volte una stessa sessione oppure metterla in una variabile e
utilizzarla al suo posto?
in altre parole se è meglio utilizzare in varie parti dello script:
$_SESSION['prova']
oppure metterla in una variabile "varprova" e utilizzarla al suo
posto?
$varprova = $_SESSION['prova'];
utilizzare $_SESSION['prova'] comporta una chiamata all'oggetto
session per ogni volta che è utilizzata nello stesso script???
grazie e saluti

 utilizzarla al suo posto?
A meno che non richiami un milione di volte la stessa variabile di
sessione, non ci sono differenze apprezzabili tra le due.
Se la richiami un milione di volte, rivedi il tuo script: c'e` qualcosa
che non va ;)
Bye.

 che non va ;)
E se vuoi proprio fugare ogni dubbio, fai un ciclo for di un milione di 
iterazioni, in cui in un caso accedi a $_SESSION, e nell'altro accedi 
alla variabile assegnata prima dell'ingresso nel ciclo. Metti un timer 
prima e dopo il ciclo, così vedi! :-)
Secondo me sarà identico (non penso che php si va ogni volta a leggere 
il file di sessione. Secondo me lo leggerà una volta, e lo cacherà. Ma 
se provi e poi mi dici te ne sarei grato. :-)
--
rob4you

 grazie e saluti
In letteratura (soprattutto quando si parla di ottimizzazione)
viene sempre consigliato, nel caso che si debba valozzirare una
variabile presente poi molte volte all'interno della logica
applicativa, di mettere l'assegnamento all'inizio del
listato e poi di utilizzare l'identificatore della
variabile tutte le volte che serve. Tutto ciň
a prescindere dal linguaggio utilizzato. Se ne deduce
che l'accesso alla struttura dati richiede piů
tempo che il richiamare una semplice variabile.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 tempo che il richiamare una semplice variabile.
Hai ragione da vendere, ma volendo essere puntigliosi :) in PHP accedere a
una variabile in $_SESSION[] non e` un normale accesso a un array, ma
innesca dei meccanismi particolari.
In lettura, viene richiamata una funzione che va a leggere dal
file|database|quelchee` di sessione il valore, e in scrittura che lo
aggiorna al volo.
Quindi assegnare il valore della sessione a una variabile da` sicuramente
vantaggi prestazionali al codice. L'entita` degli stessi, pero`, e`
trascurabile, in quanto spesso il 40% del tempo viene passato a compilare
lo script, e il 59% ad accedere al database. Rimane un 1% di esecuzione.
Preciso che sto parlando di pagine web. Nei programmi standalone cambia
tutto.
Detto questo, secondo me e` inutile farsi la para mentale di modificare
magari decine di script per questioni prestazionali, ma focalizzare
l'attenzione su una cosa fondamentale: durante quel ciclo devo solo
leggere quel valore (e allora posso "cacharlo" in una variabile) o devo
anche scriverlo (e allora devo per forza usare $_SESSION) ?
Risposto a questa domanda viene fuori il metodo migliore per gestirla.
Io, personalmente, preferisco sempre accedere a $_SESSION[] invece di
cachare il valore per un motivo di chiarezza: quando vedo quel pezzo di
ciclo so da dove arriva la variabile, e non devo andare a cercare se e`
stata valorizzata precedentemente.
Bye.

 Ma se provi e poi mi dici te ne sarei grato. :-)
Ci ho provato io: come prevedibile, accedere alla variabile tramite
$_SESSION è meno performante, ma la differenza si avverte solo per
milioni di accessi, esattamente come diceva Alessandro.
In particolare, ecco i risultati (tra parentesi il 
n.ro
 di cicli):
differenza: 1.0967254638672E-005    (10)
differenza: 6.9856643676758E-005    (100)
differenza: 0.011421203613281       (1000)
differenza: 0.00217604637146        (10000)
differenza: 0.07641077041626        (100000)
differenza: 0.675705909729          (1000000)
differenza: 6.863853931427          (10000000)
Insomma, solo se si deve accedere almeno 1mln di volte la differenza
comincia a diventare apprezzabile...
Ciao.
Maverick
-- 
«Che non siete più liberi di non avere una casa con letto per dormire.
 Lavorate voi - schiavi dei soldi - che non sentite la puzza della
 schiavitù!» (a Mario di Monte Mario, Roma) # 
http://libre.netsons.org/

 differenza: 6.863853931427          (10000000)
Cavolo, ma questo report è meglio di qualsiasi cosa avrei potuto 
immaginare!
Ma visto che io sono come San Tommaso :-) ho rifatto anche io 
un'analisi simile. Vi riporto i risultati:
Differenza di tempo            Cicli
____________________________________
-0.000024                         10
0.000018                         100
0.000226                        1000
0.002125                       10000
0.024834                      100000
0.221772                     1000000
2.303437                    10000000
Con la configurazione sulla quale ho provato (Intel Centrino 1.8GHz, 
1GB di RAM, WinXP Home, Apache 2.2.3, PHP 5.2.1) le differenze di 
tempi, per numero di cicli maggiore, diventano ancora più ridotte.
Anzi, in tutte le prove, il primo risultato, cioè quello che si ha nel 
caso di dieci cicli, dà sempre risultato negativo. Ciò implica che 
l'accesso all'array di sessione è più rapido che l'accesso all'altra 
variabile (di 24 microsecondi...cavolo...24 microsecondi! In 24 
microsecondi sai quante cose potrei fare? :-D )
ps: se interessa ecco il codice:
<pre>
<?php
function get_microtime() {
   list($usec, $sec) = explode(" ", microtime());
   return ((float)$usec + (float)$sec);
}
session_start();
$_SESSION['prova'] = "ciao";
$prova = $_SESSION['prova'];
echo sprintf("<b>%-25s %10s </b>\n", "Differenza di tempo","Cicli");
echo sprintf("<b>%'_36s</b>\n", "_");
for($i=10;$i<=10000000;$i*=10) {
	$start = get_microtime();
	for($n=0;$n<$i;$n++) {
		$temp = $prova;
	}
	$stop = get_microtime();
	$tempo = $stop - $start;
	$start1 = get_microtime();
	for($n=0;$n<$i;$n++) {
		$temp = $_SESSION['prova'];
	}
	$stop1 = get_microtime();
	$tempo1 = $stop1 - $start1;
	$diff = $tempo1 - $tempo;
	echo sprintf("%-25f %10u \n", $diff,$i);
}
?>
</pre>
--
rob4you

 
Oltre ai consigli che hanno aggiunto (tra cui le prove), mi preme 
ricordare che, in caso di oggetti (in php4), viene eseguito un 
assegnamento per valore, non per riferimento: ti troverai due copie del 
solito oggetto!
	Francesco

> Vi riporto i risultati:
E se volete dei risultati più dettagliati:
$_SESSION       $prova          Differenza di tempo       Cicli
_______________________________________________________________
0.000015        0.000036        -0.000021                    10
0.000047        0.000029        0.000018                    100
0.001825        0.000182        0.001643                   1000
0.004354        0.001753        0.002601                  10000
0.054116        0.017761        0.036355                 100000
0.482653        0.195153        0.287500                1000000
4.695094        2.177339        2.517755               10000000
--
rob4you

 E se volete dei risultati più dettagliati (includendo anche i centomilioni):
$_SESSION       $prova          Differenza di tempo       Cicli
_________________________________________________________________
0.000015        0.000037        -0.000022                    10
0.000047        0.000033        0.000014                    100
0.000369        0.000180        0.000189                   1000
0.003957        0.001753        0.002204                  10000
0.045598        0.022056        0.023542                 100000
0.447900        0.194854        0.253046                1000000
4.219327        1.979514        2.239813               10000000
44.277959       19.756604       24.521355             100000000
Come si può notare, a ogni aumento di un ordine di grandezza dei cicli, 
aumenta parallelamente di un ordine di grandezza sia il tempo per 
$_SESSION, sia per $prova, sia quindi per la differenza.
--
rob4you

 In 24 microsecondi sai quante cose potrei fare? :-D
Hum, qual è il tempo di cottura per i quattro salti in padella? ;-)
Ciao


 Bye.
Ciao.


 indichi la provenienza del valore in essa contenuta.
Beh, da questo punto di vista non potrà mai esistere una scelta 
migliore che lasciare il mondo così com'è :-)
Più esplicativo di: $_SESSION['nome_variabile'] che altro si potrebbe 
desiderare? :-)
Alla luce poi dei vari test che sono stati fatti da me e da Maverick, 
direi che il problema non avrebbe quasi manco senso porselo. :-)
--
rob4you