Ho appena trovato qualcosa di molto strano in PHP.Perché chiamare una funzione (come strlen, count ecc.) Su un valore di riferimento è così lento?
Se si passa una variabile in una funzione per riferimento, quindi si chiama una funzione, è incredibilmente lento.
Se si esegue il looping della chiamata di funzione interna e la variabile è grande, può essere più lenta di ordini di grandezza rispetto alla variabile passata per valore.
Esempio:
<?php
function TestCount(&$aArray)
{
$aArray = range(0, 100000);
$fStartTime = microtime(true);
for ($iIter = 0; $iIter < 1000; $iIter++)
{
$iCount = count($aArray);
}
$fTaken = microtime(true) - $fStartTime;
print "took $fTaken seconds\n";
}
$aArray = array();
TestCount($aArray);
?>
Questo richiede costantemente circa 20 secondi per l'esecuzione sulla mia macchina (su PHP 5.3).
Ma se cambio la funzione di passare dal valore (cioè function TestCount($aArray)
invece di function TestCount(&$aArray)
), allora viene eseguito in circa 2 ms - letteralmente 10.000 volte più veloce!
Lo stesso vale per altre funzioni integrate come strlen
e per funzioni definite dall'utente.
Cosa sta succedendo?
È 10000 volte più lento perché si sta iterando all'interno del benchmark. Questo non ti darà la misura corretta per 'count()'. Usa un profiler e vedrai che è solo 3 volte più lento. Per una spiegazione, vedi http://derickrethans.nl/talks/phparch-php-variables-article.pdf – Gordon
@Gordon - sì, è vero, ma il motivo per cui abbiamo scoperto questo è che avevamo un codice di produzione che si comportava in modo molto simile a l'esempio (cambiando la variabile ovviamente). Non è un caso d'uso particolarmente esoterico. –
non dicendo che è esoterico. solo dicendo che i numeri sono molto esagerati. – Gordon