Originariamente inviato da filippo.toso
Sei davvero sicuro che il tuo metodo sia realmente più veloce?
In effetti pensavo anch'io fosse una sorata (presentato senza fonti è quasi matematico) e invece:
Codice PHP:
// b.php è un file vuoto
$included = array();
$start = microtime(true);
for ($n = 0; $n < 50000; ++$n) {
include_once 'b.php';
}
$time = microtime(true) - $start;
echo "include_once = $time secondi\n";
$start = microtime(true);
for ($n = 0; $n < 50000; ++$n) {
if (!in_array('b.php', $included)) {
$included[] = 'b.php';
include 'b.php';
}
}
$time = microtime(true) - $start;
echo "naive approach = $time secondi\n";
Questo il risultato:
codice:
include_once = 0.33409905433655 secondi
in_array = 0.041491985321045 secondi
Indagando un pelo, mi scopro che include_once accede sempre al file system per verificare la presenza del file, anche quando è già stato incluso.
Codice PHP:
// b.php è un file vuoto
include_once 'b.php';
unlink('b.php');
include_once 'b.php';
Risultato atteso: niente. Risultato ottenuto:
codice:
PHP Warning: include_once(b.php): failed to open stream: No such file or directory in /home/nicola/tmp/a.php on line 5
PHP Warning: include_once(): Failed opening 'b.php' for inclusion (include_path='.:/usr/lib64/php') in /home/nicola/tmp/a.php on line 5
Molto male...