7
votes

IS_FILE / FILE_EXISTES Performance et cache

J'ai fait des tests pour comparer et mesurer la vitesse des deux fonctions. is_file semble être plusieurs fois plus rapide (j'ai utilisé 10000 itérations pour les deux) que file_exists . Je me demande si PHP ou OS utilise un cache pour ces fonctions ou est-ce que vous accédez toujours au disque dur? Je pense que non, mais je me demande ...

J'ai utilisé ce code: xxx


3 commentaires

Appelez-vous cela plusieurs fois dans une boucle serrée (où cet effet dominera la demande de demande)? Sinon, je ne m'inquiéterais pas à ce sujet à moins d'être sûr que vous êtes sûr de vous causer un problème de performance ... N'oubliez pas que L'optimisation prématurée est la racine de tous les malles ... Utilisez l'alternative sémantiquement meilleure jusqu'à ce que Vous savez que c'est un problème, puis optimiser alors et seulement alors ...


En effet, is_file () est un alourdissement 10 fois plus rapide que FILE_EXIST ()! Je viens de l'essayer et c'est vrai.


Si cela aide à quelqu'un que nous pouvons ajouter ce fichier_exists () reviendra être vrai pour les répertoires et les fichiers existants, où is_file () ne reviendra que VRAI s'il s'agit d'un fichier (et existe bien sûr).


3 Réponses :


9
votes

Caches PHP Les deux is_file () et file_exists () dans le cache Stat. Appelez ClearStatCache () pour l'effacer.

EDIT:
Si quelque chose, les deux devraient prendre des quantités similaires car elles appellent tous les deux le système d'exploitation STAT () Fonction , mais les résultats d'un peut être mis en cache pour l'autre par PHP (sauf si vous ClearStatCache () ) ou par le système d'exploitation comme Yuliy mentionne ci-dessous.


2 commentaires

Notez que les mesures de performance sur les opérations de fichier risquent de varier de la cache du système de fichiers du système d'exploitation


Strace Affiche les appels File_exists Accès ("FOO", F_OK) PENDANT IS_FILE IS_FILE STAT ("FOO", 0x7FFE720A8A0)



2
votes

is_file et file_existes sont deux fonctions différentes qui font deux choses différentes; File_exists Vérifiez uniquement si le fichier existe, is_file indique si la cible est un fichier valide et (par exemple) non pas un répertoire.

Ils ne devraient pas être utilisés pour le même objectif, la comparaison de performance ne peut pas être faite (IMHO)


11 commentaires

Ce n'est pas entièrement correct. Cependant, les fonctions ont été conçues, l'objectif est d'atteindre le résultat souhaité. Dans ce cas, IS_FILE () et FILE_EXISTES () renvoyez FALSE si le fichier n'existe pas. Et les repères prouvent que l'utilisation is_file () donnera à votre application un avantage sur une application similaire à l'aide de fichiers_exists ().


@Sttillage: Mais quel genre de bord parle-t-on? Étant donné que le disque stat () sera la partie la plus lente, je serais surpris si les deux diffèrent de plus d'un ou deux pour cent. Après tout, utilisez les mêmes données, on revient simplement tôt (et les deux ne devraient faire qu'un seul appel système) ... au moins cela me comprend de toute façon ...


@Stillaison: quels repères? Je pense que file_existes serait légèrement plus rapide, car il n'a pas à vérifier si le STRUCTURE STAT 'S Mode_T Contient S_IFDIR ou non.


Exactement @R. Bemrose ... pseudocode devrait être pour File_exists : retour false! == Stat () et pour is_file : $ STAT = STAT (); Si ($ stat! == false) {return ($ stat ['mode_t'] & s_ifreg)! = 0; } renvoyer false ... donc is_file devrait être plus lent (mais pas beaucoup, car le STAT () dominera toujours les autres constructions de langue simples). .


is_file () vérifie uniquement si l'ARG est un fichier. File_exists () vérifie si l'ARG est un fichier ou un répertoire. La vitesse devrait sortir même si le fichier / dossier dans les deux fonctions n'existe pas.


Une référence rapide sur mon système (appelant ClearStatCache () montre qu'ils sont tous deux dans une marge d'erreur les uns des autres (environ 1% de différence en moyenne) ... donc (au moins sur mon système de fichiers ext3) ) Il y a vraiment peu de différence (comme prévu que le Stat () L'appel système domine le temps) ... et pour l'enregistrement file_exists () ne vérifie pas si c'est un Fichier ou un répertoire, il vérifie simplement que l'objet du système de fichiers existe (et ne se soucie pas de quel type, il pourrait s'agir d'un dispositif de blocage pour tout ce qu'il soucie, c'est-à-dire que quelque chose de ce nom existe) ...


Essayez d'exécuter le code PHP que j'ai utilisé pour tester et poster des résultats, cela me montre une grande différence entre les deux fonctions


@Sttillaison: Je ne peux pas être d'accord avec votre premier commentaire. Si vous avez besoin si quelque chose existe sur votre lecteur, allez avec file_existes . Si vous devez savoir si la cible est un fichier valide, allez avec is_file , vous gagnerez la lisibilité et la fiabilité du code. Que se passe-t-il si NOATER Developer (travail d'équipe?) Lisez votre code? Ou quand vous aurez besoin de modifier les années de code lesters? Si je vois is_file Je suppose que l'environnement doit savoir si c'est un fichier réel et l'utiliser en conséquence. Pourquoi construire une incompressionniste pour gagner quoi - 0,001 ms? Mais je suppose que je suppose.


@Daniel: Ce n'est pas hors du sujet. C'est un très mauvais paradigme de micro-optimisation. Tuer la lisibilité et l'exactitude sémantique pour des gains toujours si légers à la vitesse (quand il n'est même pas connu si ce gain de vitesse est nécessaire) ... Il est plus facile d'optimiser le code correct que de corriger le code optimisé .. .


@,IRCMAXELL: C'est exactement ce que je veux dire


En fait, j'ai vu un test de performance qui a conclu que is_file est effectivement plus rapide. Les personnes dans le monde WP utilisent également tout le temps même si le souhait de savoir si un fichier existe mais malgré son nom if_file_existes retournera également true sur les annuaires appelés DirectoryName.php < / Code> Je pensais que tout le monde le fait mal, le nom de la fonction est horrible étant donné que cela fait ... et a choisi d'utiliser is_file pour vérifier si les fichiers existent. Ce serait intéressant si c'était et est vraiment plus rapide maintenant dans un monde PHP7.



11
votes

Lorsque vous utilisez Stat (), lstat () ou tout des autres fonctions énumérées dans le Liste des fonctions concernées (ci-dessous), PHP cache l'information ces fonctions retour afin de fournir plus vite performance. Cependant, dans certains cas, vous voudrez peut-être effacer la informations en cache. Par exemple, si Le même fichier est en cours de vérification plusieurs fois dans un script unique, et ce fichier est en danger d'être enlevé ou changé pendant que opération du script, vous pouvez choisir de choisir Effacer le cache d'état. Dans ces cas, vous pouvez utiliser le ClearStatCache () fonction pour effacer le informations que PHP caches sur un Fichier.

Les fonctions concernées incluent Stat (), lstat (), fichier_exists (), is_watable (), is_readable (), is_executable (), is_file (), is_dir (), is_link (), filectime (), fileatime (), filemtime (), FileInode (), FileGroup (), File Semeur (), ci-dessus (), filetype (), et Fileperms ().


3 commentaires

Mais les deux fonctions sont dans cette liste, de sorte que cela ne semble pas expliquer pourquoi on serait beaucoup plus rapide que l'autre.


Vous exécutez le test fichier_exists () d'abord, ce qui doit faire la lecture réelle de disque et stocker à StatCache; Ensuite, vous exécutez le IS_FILE () qui lit simplement l'entrée STATCACHACHE qui a déjà été renseignée par le chèque file_exists () , donc il est (pas surprenant) beaucoup plus vite. Rincer le cache entre les tests, puis vous allez tester is_file () avec précision car il devra vérifier le disque et remplir le cache de la même manière que fichier_exists () a fait


Votre réponse ... était trop lent. Veille à ce que cela soit amélioré;)