is_file vs. file_exists

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

is_file vs. file_exists

Beitrag 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
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag 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 = ...
KB:knigge
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag 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
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag 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?
KB:knigge
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Pyramide hat geschrieben:Hast du vielleicht kein PHP5?
Nein. Muss ich mich jetzt schämen :oops:

:lol:

Ist das bei PHP4 anders?
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag 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:
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag 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);
}
?>
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag 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:
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Pyramide hat aber so tolle Zahlen und ich nicht :cry:

:lol:
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag 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:
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Antworten

Zurück zu „Coding & Technik“