Seite 1 von 2

is_file vs. file_exists

Verfasst: 23.04.2006 15:56
von mgutt
Ich wollte gerade mal die beiden Funktionen von der Geschwindigkeit her vergleichen.

Hier der Code:

Code: Alles auswählen

<?php
for ($j=0; $j<10; $j++) {

$times_fe=$times_if=0;

for ($i=0; $i<50000; $i++) {
    $starta=microtime(true);
    file_exists('robots.txt');
    $times_fe+=(microtime(true)-$starta);

    $startb=microtime(true);
    is_file('robots.txt');
    $times_if+=(microtime(true)-$startb);

    clearstatcache();
} 

echo 'file_exists: '.($times_fe).'<br>';
echo 'is_file: '.($times_if).'<br>';
}
?>
Nur was ich nicht verstehe sind die Minuszahlen. Ich bekomme bei beiden negative Ergebnisse? Rechnet der falsch :lol:

Ergebnisse:
file_exists: 1.9488929999999
is_file: -2.4410359999992
file_exists: -2.5928619999991
is_file: 2.5952070000004
file_exists: 0.60511600000008
is_file: 0.19567800000002
file_exists: -0.42561999999985
is_file: -0.31281099999997
file_exists: 1.1311709999997
is_file: -1.2134630000004
file_exists: 0.80221000000004
is_file: -0.55545899999994
file_exists: 0.23826499999993
is_file: -0.57814499999986
file_exists: -0.52606399999991
is_file: -0.55386000000004
file_exists: 1.7290890000001
is_file: -0.60495099999995
file_exists: -1.830836
is_file: 1.0281040000001

Verfasst: 23.04.2006 16:13
von Pyramide
Vielleicht solltest du die Zeitmessung ausserhalb der Schleife machen, das hat auch noch den Vorteil, daß die Ergebnisse weniger durch die microtime() Aufrufe verfälscht werden:

Code: Alles auswählen

$start = ...
for(...)
{
    file_exists();
}
$end = ...

Verfasst: 23.04.2006 16:29
von mgutt

Code: Alles auswählen

<?php
for ($j=0; $j<10; $j++)
{
	$times_fe=$times_if=0;

	$starta=microtime(true);
	for ($i=0; $i<50000; $i++)
	{
	    file_exists('robots.txt');
	    clearstatcache();
	}
	$times_fe=(microtime(true)-$starta);

	$startb=microtime(true);
	for ($i=0; $i<50000; $i++)
	{
	    is_file('robots.txt');
	    clearstatcache();
	}
	$times_if=(microtime(true)-$startb);
	echo ($j).'. Durchlauf:<br>';
	echo 'file_exists: '.($times_fe).'<br>';
	echo 'is_file: '.($times_if).'<br><br>';
	unset($times_fe,$times_if,$starta,$startb);
}
?>
ergibt:
0. Durchlauf:
file_exists: -0.576531
is_file: -0.053621

1. Durchlauf:
file_exists: 0.484816
is_file: 0.446421

2. Durchlauf:
file_exists: -0.335591
is_file: -0.410526

3. Durchlauf:
file_exists: 0.335942
is_file: 0.318935

4. Durchlauf:
file_exists: -0.660385
is_file: -0.098751

5. Durchlauf:
file_exists: 0.239458
is_file: 0.450872

6. Durchlauf:
file_exists: -0.213326
is_file: -0.50736

7. Durchlauf:
file_exists: 0.138566
is_file: 0.299821

8. Durchlauf:
file_exists: -0.1609
is_file: -0.265203

9. Durchlauf:
file_exists: -0.016081
is_file: 0.652117

Verfasst: 23.04.2006 16:43
von Pyramide
Bei mir funktioniert das:
0. Durchlauf:
file_exists: 0.83585691452
is_file: 1.76472306252

1. Durchlauf:
file_exists: 0.819831132889
is_file: 1.76916003227

2. Durchlauf:
file_exists: 0.820491790771
is_file: 1.76927399635
Und wie zu erwarten war, ist is_file langsamer, denn file_exists prüft nur, ob die Datei existiere, während is_file zusätzlich prüft, ob es eine Datei ist.

Hast du vielleicht kein PHP5?

Verfasst: 23.04.2006 17:33
von mgutt
Pyramide hat geschrieben:Hast du vielleicht kein PHP5?
Nein. Muss ich mich jetzt schämen :oops:

:lol:

Ist das bei PHP4 anders?

Verfasst: 23.04.2006 18:07
von S2B
php.net hat geschrieben:Anmerkung: Der Parameter get_as_float wurde in PHP 5.0.0 eingeführt.
Nimm mal die Funktion anstatt microtime():

Code: Alles auswählen

function microtime_float()
{
	$mtime = microtime();
	$mtime = explode(' ', $mtime);
	$mtime = $mtime[1] + $mtime[0];
	return $mtime;
}
:wink:

Verfasst: 25.04.2006 00:12
von mgutt
Naja. Ich vertraue dann lieber nicht in meinen Zahlen:

Code: Alles auswählen

0. Durchlauf:
file_exists: 4.7553629875183
is_file: 1.3501629829407

1. Durchlauf:
file_exists: 1.2170100212097
is_file: 1.1003658771515

2. Durchlauf:
file_exists: 1.6514539718628
is_file: 2.0320470333099

3. Durchlauf:
file_exists: 4.0182020664215
is_file: 2.5866990089417

4. Durchlauf:
file_exists: 1.3828659057617
is_file: 4.1232419013977

5. Durchlauf:
file_exists: 1.1345329284668
is_file: 1.2346220016479

6. Durchlauf:
file_exists: 2.0263838768005
is_file: 1.7285401821136

7. Durchlauf:
file_exists: 3.2129409313202
is_file: 3.9513540267944

8. Durchlauf:
file_exists: 3.2447288036346
is_file: 1.3808219432831

9. Durchlauf:
file_exists: 1.4632909297943
is_file: 1.0986988544464
Schade, bei mir gehts dann wohl nicht mit php4:

Code: Alles auswählen

<?php
function microtime_float()
{
	$mtime = microtime();
	$mtime = explode(' ', $mtime);
	$mtime = $mtime[1] + $mtime[0];
	return $mtime;
}

for ($j=0; $j<10; $j++)
{
	$times_fe=$times_if=0;

	$starta=microtime_float();
	for ($i=0; $i<50000; $i++)
	{
	    file_exists('robots.txt');
	    clearstatcache();
	}
	$times_fe=(microtime_float()-$starta);

	$startb=microtime_float();
	for ($i=0; $i<50000; $i++)
	{
	    is_file('robots.txt');
	    clearstatcache();
	}
	$times_if=(microtime_float()-$startb);
	echo ($j).'. Durchlauf:<br>';
	echo 'file_exists: '.($times_fe).'<br>';
	echo 'is_file: '.($times_if).'<br><br>';
	unset($times_fe,$times_if,$starta,$startb);
}
?>

Verfasst: 25.04.2006 19:36
von S2B
Warum sollte das unter PHP4 nicht gehen? Dass es Schwankungen in der Ausführzeit der Befehle gibt, ist doch ganz normal. Vielleicht könntest du alternativ auch einfach die Durchschnittszeit der Aufrufe berechnen, das hat bei mir bis jetzt immer gut hingehauen. :wink:

Verfasst: 25.04.2006 20:14
von mgutt
Pyramide hat aber so tolle Zahlen und ich nicht :cry:

:lol:

Verfasst: 25.04.2006 20:26
von S2B
Naja, es kommt auch immer auf den Server/PC an, auf dem du dein Script ausführst. Versuche es doch mal mit der Durchschnittsberechnung, vielleicht sind die Zahlen ja da besser. :wink: