Me pregunto cómo File.exists() obras. No estoy muy enterado de cómo los sistemas de ficheros de trabajo, así que tal vez debería empezar a leer primero.

Pero para una rápida pre información:

Es una llamada a la File.exists() una sola acción para el sistema de archivos, si es que la ruta y el nombre están registrados en alguna revista? ¿O es que el SO de obtener el contenido de un directorio y, a continuación, analizar a través de él para los partidos?

Supongo que este será el sistema de archivos a su cargo, pero tal vez todos los sistemas de archivos utilizan el enfoque rápido?

No estoy hablando acerca de la red y los sistemas de cinta. Permite mantener a ntfs, extX, zfs, jfs 🙂

  • Diario de los sistemas de ficheros son totalmente diferentes de los demás.
  • Esto va a ser muy de sistema de archivos dependientes. Cuando usted está accediendo a un archivo en un NFS o recurso compartido de archivos SMB, podría implicar el establecimiento de una conexión de red. Si el subyacente disco está apagado, usted tendrá que esperar para que comience a girar (peor aún si es de una unidad óptica). Diablos, hay situaciones (tales como almacenamiento jerárquico) donde podría implicar la carga de una cinta y, literalmente, cuestión de minutos!
InformationsquelleAutor Franz Kafka | 2011-06-12

4 Comentarios

  1. 15

    Cómo esta operación si se realiza la primera vez que es totalmente dependiente en el sistema de archivos. Esto se hace por el sistema operativo y Java no jugar en cualquier parte.

    En términos de rendimiento, una lectura de un disco es necesaria en todos los casos. Esto normalmente tarda de 8 a 12 ms. @Sven señala algunas de almacenamiento podría más lento, pero es relativamente rara en los casos donde el rendimiento es importante. Usted puede tener un retraso adicional si se trata de un sistema de archivos de red (en general, relativamente pequeña, pero depende de la latencia de red).

    Todo lo demás el sistema operativo y Java es muy corto en comparación.

    Sin embargo, si el archivo existe en repetidas ocasiones, un acceso a Disco, puede no ser necesario ya que la información puede almacenar en caché, en este caso, el tiempo OS tarda y recursos. Uno de los más grandes de estos el de los objetos de Archivo.existe() crea (que no parece) sin embargo, se codifica el nombre del archivo en cada llamada de la creación de una gran cantidad de objetos. Si pones el Archivo.existe() en un bucle ajustado puede crear 400MB de basura por segundo. 🙁

    Diario de los sistemas de ficheros de trabajo de manera diferente por mantener un seguimiento de todos los cambios que usted realice a un sistema de archivos, sin embargo no cambiar la forma de leer el sistema de archivos.

  2. 16

    Medir el tiempo necesario y se vea a sí mismo. Como usted dice que es absolutamente sistema de archivos dependientes de la.

            long t1 = System.currentTimeMillis();
            ...Your File.exists call
            long t2 = System.currentTimeMillis();
            System.out.println("time: " + (t2 - t1) + " ms");

    Verás que siempre te dará resultados diferentes, ya que depende también de la forma en la que el sistema operativo almacena en caché los datos, en su carga, etc.

    • Casi depende enteramente de si un disco es necesario el acceso, en cuyo caso, la velocidad del disco (y si está ocupado) será lo que importa. Si la prueba cuando el archivo está en la caché, usted está mejor con el Sistema.nanoTime (), ya que suelen ser sub-mili-segundos.
    • Sistema.currentTimeMillis() no necesariamente dará milisegundo-tiempo de resolución. :/
    • NanoTime es, sin duda preciser! Todavía currentTimeMillis puede dar la gran idea también. También se puede colocar el sistema de carga es un factor en la ecuación antes de medir, pero los resultados serán siempre aproximados. Recuerde: no se puede observar un experimento sin de alguna manera alterar…
    • No está del todo hasta el FS aplicación, sino más bien a la política de caché para los sistemas de ficheros en un sistema operativo. Usted puede obtener una respuesta más rápida si el directorio se almacena en caché y el archivo o el directorio ha sido utilizado recientemente.
    • Absolutamente De Daniel!
    • currentTimeMillis es acerca de la exacta acerca de 15ms en una plataforma Windows, que en realidad no es tan grande para algo que puede tomar mucho menos tiempo.
    • ¿Por qué autobox long a Long sólo para volver a convertirlo en un long durante la resta?
    • Gracias Steve! Debe ser de largo! He cambiado.
    • nanoTime es raro, que ha sido discutido varias veces por qué (TSC en.wikipedia.org/wiki/Time_Stamp_Counter los valores difieren en mutli-zócalo de sistemas), por lo que toma un hipervisor para interceptarla y así sucesivamente. Si no hay ninguno, usted puede terminar w/ lo que se obtiene a partir de System.currentTimeMillis(), por lo que es OS/depende del hardware.
    • Es por eso que no he cambiado el código de la respuesta 🙂
    • Última vez que lo comprobé currentTimeMillis sólo ha cambiado en trozos de unos 10 a 15 milisegundos. Como que es aproximadamente el tiempo de un subproceso se ejecuta antes de un cambio de contexto yo diría que es actualizado cada cambio de contexto. Independientemente que no es bueno para nada que es rápido. Yo no estoy familiarizado con nanoTime, a pesar de enganche en queryperformancecounter es definitivamente una gran manera para el tiempo de las cosas.

  3. 8

    La mayoría de los archivos relacionados con las operaciones no se realizan en Java, el código nativo existe para realizar estas actividades. En realidad, la mayoría del trabajo realizado depende de la naturaleza de la FileSystem objeto (que es la copia de la File objeto) y la implementación subyacente de los nativos de operaciones de e /s en el sistema operativo.

    Voy a presentar el caso de la aplicación en OpenJDK 6, para mayor claridad. El Archivo.existe() implementación difiere de los controles para el sistema de archivos de la clase:

    public boolean exists() {
        ... calls to SecurityManager have been omitted for brevity ...
        return ((fs.getBooleanAttributes(this) & FileSystem.BA_EXISTS) != 0);
    }

    El sistema de archivos de la clase es abstracta, y una aplicación que existe para todos los sistemas de archivos:

    package java.io;
    
    
    /**
     * Package-private abstract class for the local filesystem abstraction.
     */
    
    abstract class FileSystem

    Aviso de que el paquete de naturaleza privada. Un Entorno de ejecución de Java, ofrecerá clases concretas que extender el sistema de archivos de la clase. En el OpenJDK implementación, hay:

    • java.io.WinNTFileSystem, para NTFS
    • java.io.Win32FileSystem, FAT32 para
    • java.io.UnixFileSystem, para *nix sistemas de ficheros (esto es una clase con un abanico muy amplio de responsabilidad).

    Todos los de las clases anteriores delegado a código nativo, para la getBooleanAttributes método. Esto implica que el rendimiento no está limitado por el administrado (Java) el código en este caso; la aplicación del sistema de archivos, y la naturaleza de los nativos de las llamadas que se hagan tienen una mayor influencia en el rendimiento.

    Actualización #2

    Basado en la actualización de la pregunta –

    No estoy hablando acerca de la red y los sistemas de cinta. Permite mantener a ntfs, extX, zfs, jfs

    Bueno, eso no importa. Diferentes sistemas operativos implementar el soporte para sistemas de archivos diferentes en maneras diferentes. Por ejemplo, soporte de NTFS en Windows va a ser diferente de la en *nix, debido a que el sistema operativo también tiene que hacer su parte de la contabilidad, además de comunicarse con los dispositivos a través de sus conductores; no todo el trabajo se realiza en el dispositivo.

    En Windows, usted va a encontrar casi siempre en el concepto de un sistema de archivos de los controladores de filtro que gestiona la tarea de comunicación con otro sistema de archivos de los controladores de filtro o el sistema de archivos. Esto es necesario para apoyar las diversas operaciones; un ejemplo sería el uso de controladores de filtro para motores anti-virus y otro software (on-the-fly de cifrado y compresión de los productos) interceptar IO llamadas.

    En *nix, usted tendrá la stat(), llamadas al sistema que será necesario realizar la actividad de lectura de los inodos de información para el descriptor de archivo.

  4. 0

    Es super rápido en cualquier maquinaria moderna, mis pruebas muestran 0.0028 millis (2.8 microsegundos) en mi 2013 Mac w/SSD

    1.000 archivos creados en 307 millis, 0.0307 millis por archivo

    1,000 .existe (), hecho en 28 de millis, 0.0028 millis por archivo

    He aquí una prueba en Groovy (Java)

    def index() {
        File fileWrite
    
        long start = System.currentTimeMillis()
    
        (1..1000).each {
            fileWrite = new File("/tmp/fileSpeedTest/${it}.txt")
            fileWrite.write('Some nice text')
        }
        long diff = System.currentTimeMillis() - start
        println "1,000 files created in $diff millis, ${diff/10000.0} millis per file"
    
    
    
        start = System.currentTimeMillis()
        (1..1000).each {
            fileWrite = new File("/tmp/fileSpeedTest/${it}.txt")
            if ( ! fileWrite.exists() )
                throw new Exception("where's the file")
        }
        diff = System.currentTimeMillis() - start
        println "1,000 .exists()   done in  $diff millis, ${diff/10000.0} millis per file"
    
    }

Dejar respuesta

Please enter your comment!
Please enter your name here