Combien coûte de Fichier.existe en Java
Je me demande comment File.exists()
œuvres. Je ne suis pas très au courant de la façon dont les systèmes de fichiers de travail, donc je devrais peut-être commencer à lire en premier.
Mais pour un rapide pré informations:
Est un appel à File.exists()
une seule action pour le système de fichiers, si le chemin d'accès et nom de fichier sont enregistrées dans certains journal? Ou l'OS d'obtenir le contenu du répertoire et ensuite analyser pour les matchs?
Je présume que ce sera du système de fichiers de personne à charge, mais peut-être que tous les systèmes de fichiers utilisation de l'approche rapide?
Je ne parle pas de réseau et les systèmes de bande. Permet de garder en ntfs, extX, zfs, jfs 🙂
- Systèmes de fichiers journalisés sont totalement différents des autres.
- Cela va être très système de fichiers de personne à charge. Lorsque vous accédez à un fichier sur un NFS ou SMB partage de fichiers, il peut impliquer la création d'une connexion réseau. Si le sous-jacent disque est éteint, vous aurez à attendre pour qu'il tourne (encore pire si c'est un lecteur optique). Heck, il y a des situations (comme le stockage hiérarchique) où il pourrait impliquer le chargement d'une bande et prendre littéralement minutes!
Vous devez vous connecter pour publier un commentaire.
La façon dont cette opération si elle est effectuée la première fois, est totalement dépendant du système de fichiers. Ceci est fait par le système d'exploitation et Java ne pas jouer n'importe quel rôle.
En termes de performances, la lecture d'un disque est requis dans tous les cas. Ce processus prend habituellement de 8 à 12 mme. @Sven points certaines de stockage pourrait plus lent, mais cela est relativement rare dans les cas où la performance est importante. Vous pouvez disposer d'un délai supplémentaire si c'est un système de fichiers réseau (en général relativement faible, mais cela dépend de votre réseau de latence).
Tout le reste de l'OS et de Java est très court en comparaison.
Toutefois, si vous vérifiez le fichier existe à plusieurs reprises, un accès Disque ne peut pas être exigé que l'information peut-mis en cache, dans ce cas, le temps que l'OS prend et des ressources. L'un des plus gros de ces objets Fichier.exists() crée (vous ne pensez pas qu'il serait) cependant il encode le nom du fichier à chaque appel de créer un grand nombre d'objets. Si vous mettez le Fichier.exists() dans une boucle serrée, il peut créer de 400 mo de déchets par seconde. 🙁
Systèmes de fichiers journalisés travailler différemment en gardant la trace de toutes les modifications que vous apportez à un système de fichiers, cependant, ils ne changent pas la façon dont vous lisez le système de fichiers.
Mesurer le temps nécessaire et de voir vous-même. Comme tu le dis c'est absolument système de fichiers dépendants.
Vous allez voir qu'il va toujours vous donner des résultats différents, car il dépend aussi de la façon dont votre système d'exploitation cache de données, sur sa charge, etc.
long
àLong
seulement pour la convertir à unlong
lors de la soustraction?System.currentTimeMillis()
, il est donc OS/dépendant du matériel.La plupart des fichiers liés à des opérations ne sont pas effectuées en Java; code natif existe pour effectuer ces activités. En réalité, la plupart du travail effectué dépend de la nature de la
FileSystem
objet (qui est la sauvegarde de laFile
objet) et de la mise en œuvre de la maternelle opérations d'e /s dans le système d'exploitation.Je vais vous présenter le cas de la mise en œuvre dans OpenJDK 6, pour plus de clarté. Le Fichier.existe (ce) de la mise en œuvre reporte les contrôles pour le système de fichiers de classe:
Le système de fichiers de classe est abstraite, et une mise en œuvre en existe pour tous les systèmes de fichiers supportés:
Avis le package de nature privée. Un Environnement d'Exécution Java, concrets des classes qui étendent le système de fichiers de classe. Dans l'OpenJDK mise en œuvre, il y a:
Toutes les classes ci-dessus délégué à du code natif, pour la
getBooleanAttributes
méthode. Cela implique que la performance n'est pas limité par l'géré (Java) code dans ce cas; la mise en œuvre du système de fichiers, et la nature de la maternelle appels ont une plus grande incidence sur les performances.Mise à jour #2
Basée sur la mise à jour de question -
Bien, n'est toujours pas question. Les différents systèmes d'exploitation vont implémenter le support pour les différents systèmes de fichiers de différentes manières. Par exemple, la prise en charge du NTFS dans Windows sera différent de celui sous *nix, parce que le système d'exploitation devra également faire part de la tenue de livres, en plus de communiquer avec les périphériques par l'intermédiaire de leurs conducteurs; pas tout le travail est effectué dans l'appareil.
Dans Windows, vous trouverez presque toujours le concept de filtre de système de fichiers de pilotes qui gère la tâche de communiquer avec les autres systèmes de fichiers des pilotes de filtre ou le système de fichiers. Cela est nécessaire pour soutenir des opérations diverses; un exemple serait l'utilisation de pilotes de filtre pour les moteurs anti-virus et autres logiciels (à la volée de cryptage et de compression des produits) l'interception IO appels.
Sous *nix, vous aurez la stat(), appel système qui va réaliser la nécessaire activité de lecture de l'inode d'information pour le descripteur de fichier.
C'est super rapide sur n'importe quel machine moderne, mes tests montrent 0.0028 millis (2.8 microsecondes) sur mon 2013 Mac w/SSD
De 1 000 fichiers créés dans 307 millis, 0.0307 millis par fichier
De 1 000 .exists() fait en 28 millis, 0.0028 millis par fichier
Voici un test en Groovy (Java)