is_file/file_exists Leistung und cache
Machte ich einige tests zu vergleichen und zu Messen die Geschwindigkeit der beiden Funktionen. is_file scheint um ein Vielfaches schneller (ich habe 10000 Iterationen für beide) als file_exists . Ich Frage mich, ob PHP oder OS verwenden einige cache für diese Funktionen oder nicht immer Zugriff auf HDD ? Ich denke Nein, aber ich Frage mich...
Habe ich diese code:
<?php
$time = microtime();
$time = explode(' ', $time);
$begintime = $time[1] + $time[0];
for($i=0;$i<10000;$i++)
file_exists('/Applications/MAMP/htdocs/index.php');
$time = microtime();
$time = explode(" ", $time);
$endtime = $time[1] + $time[0];
$totaltime = ($endtime - $begintime);
echo 'PHP parsed this in ' .$totaltime. ' seconds.</br>';
$time = microtime();
$time = explode(" ", $time);
$begintime = $time[1] + $time[0];
for($i=0;$i<10000;$i++)
is_file('/Applications/MAMP/htdocs/index.php');
$time = microtime();
$time = explode(" ", $time);
$endtime = $time[1] + $time[0];
$totaltime = ($endtime - $begintime);
echo 'PHP parsed this in ' .$totaltime. ' seconds.</br>';
?>
- Rufen Sie diese oft in einer engen Schleife (wo dieser Effekt dominiert der Wunsch, Zeit)? Wenn nicht, würde ich nicht kümmern, es sei denn Sie sicher sind, dass es Sie verursacht ein performance-problem haben... denken Sie Daran, dass
Premature optimization is the root of all evil
... Verwenden, die semantisch die bessere alternative, bis Sie wissen, es ist ein problem, und dann optimieren, dann und nur dann... - In der Tat, is_file() ist eine satte 10 mal schneller als mit file_exists()! Habe es gerade ausprobiert, und es stimmt.
- Wenn es hilft niemandem, wir können hinzufügen, dass file_exists() wird true zurückgegeben, für beide Verzeichnisse und Dateien, die existieren, wo is_file() nur dann true zurück wenn es eine Datei (und vorhanden ist, natürlich).
Du musst angemeldet sein, um einen Kommentar abzugeben.
file_exists()
erst testen, was das eigentliche Lesen von der Festplatte und speichern zu statcache; dann führen Sie dieis_file()
die einfach liest statcache Eintrag, der bereits gefüllt wurde, die von derfile_exists()
überprüfen, so ist es (nicht überraschend) viel schneller. Spülen Sie den cache, die zwischen den tests, und dann werden Sie testenis_file()
genau, weil es haben wird, um zu überprüfen, die Festplatte und den cache füllen in der gleichen Weise, dassfile_exists()
habenPHP-caches sowohl
is_file()
undfile_exists()
im stat-cache. Rufen Sieclearstatcache()
um es zu deaktivieren.Edit:
Wenn überhaupt, sollten die beiden nehmen ähnlich viel Zeit, weil Sie beide rufen das OS ist
stat()
- Funktion, aber die Ergebnisse kann man zwischengespeichert werden, für die anderen, die von PHP (es sei denn, Sieclearstatcache()
) oder durch das OS als Yuliy erwähnt unten.strace
zeigt file_exists Aufrufeaccess("foo", F_OK)
währendis_file
hatstat("foo", 0x7fffe720a8a0)
is_file
undfile_exists
sind zwei verschiedene Funktion, die zwei verschiedene Dinge;file_exists
nur prüfen ob die Datei vorhanden ist,is_file
sagen, wenn das Ziel ist, eine gültige Datei, und (zum Beispiel) nicht ein Verzeichnis.Sie sollte nicht verwendet werden, die für das gleiche Ziel, so dass der performance-Vergleich kann nicht getan werden (imho)
stat()
ist der langsamste Teil, ich würde sein überrascht, wenn die beiden unterscheiden sich um mehr als VIELLEICHT ein oder zwei Prozent. Nach alle, beide benutzen die gleichen Daten, die man eben zurück früher (und beides sollte nur werden, was zu einem system call)... zumindest ist das mein Verständnis davon...file_exists
wäre etwas schneller, da Sie nicht haben, um zu überprüfen, ob die stat-Struktur'smode_t
enthält S_IFDIR oder nicht.file_exists
:return false !== stat()
und füris_file
:$stat = stat(); if ($stat !== false) { return ($stat['mode_t'] & S_IFREG) != 0; } return false
... Sois_file
sollte langsamer sein (aber nicht viel, da diestat()
werden, Dominieren noch immer die andere einfache Sprachkonstrukte)...clearstatcache()
zeigt, dass Sie beide innerhalb einer Fehlermarge von einander (etwa 1% Unterschied im Schnitt)... So (zumindest auf meiner ext3-Dateisystem) gibt es wirklich kaum einen Unterschied (da wie erwartet diestat()
system call dominiert der Zeit)... Und für die Aufnahmefile_exists()
nicht überprüfen, ob es eine Datei oder ein Verzeichnis, es prüft nur, dass das filesystem-Objekt vorhanden ist (und kümmert sich nicht welche Art, es könnte ein block-Gerät für alle die es interessiert, nur, dass etwas mit diesem Namen existiert)...file_exists
. Wenn Sie wissen müssen, wenn das Ziel ist, eine gültige Datei, gehen mitis_file
, Sie gewinnen an Lesbarkeit und Zuverlässigkeit des Codes. Was passiert, wenn noather Entwickler (team?) Lesen Sie Ihren code? Oder wenn Sie benötigen, um den code Bearbeiten Jahre bis später? Wenn ich seheis_file
ich denke, die Umwelt muss wissen, ob eine real-Datei, und verwenden Sie es entsprechend. Warum bauen incomprension für Gewinn, was - 0.001 ms? Aber ich werde off-topic, denke ich.It's easier to optimize correct code than to correct optimized code
...is_file
ist tatsächlich schneller. Auch die Menschen in der WP-Welt verwenden es die ganze Zeit, auch wenn die wirklich wollen, zu wissen, ob eine Datei existiert, aber trotz seines namensif_file_exists
auch true zurückgeben, auf Verzeichnisse, die aufgerufen werdendirectoryname.php
so war ich denken, jeder macht es falsch, der name der Funktion ist schrecklich, angesichts der Tatsache, dass es das tut ... und entschied sich für die Verwendungis_file
für die überprüfung, ob Dateien vorhanden ist. Es wäre interessant, wenn es war und ist wirklich schneller jetzt in php7 Welt.