El tiempo de ejecución de la tarea JavaFX varía

Tengo un programa JavaFX donde el usuario puede cargar un archivo XML. Este archivo se está analizando usando javax.xml.parser.DocumentBuilder en un subproceso de trabajo que se extiende javafx.concurrent.Task.

Cargar y analizar los archivos xml funciona bien. El problema es que con algunos archivos la carga tarda mucho más que con otros y no puedo entender qué hace que el proceso de carga tarde más.

Medí la duración de la tarea de carga para dos archivos de ejemplo diferentes. Archivo A tiene un tamaño de alrededor de 80 MB, el tamaño de un archivo B es de aproximadamente 50 MB. Cargando archivo A toma alrededor de 5 segundos en promedio, mientras que es alrededor de 20 segundos para Archivo B. Ambos archivos tienen ~1,000,000 de nodos con ~60% de nodos de texto con espacios en blanco. Además, la estructura del árbol de archivos de ambos archivos es similar y el procesamiento de los archivos analizados org.w3c.dom.Document en pasos posteriores toma aproximadamente la misma cantidad de tiempo.

Otra observación que hice es que cuando estoy cargando File A la GUI tiene algunos retrasos graves, mientras que funciona sin problemas al cargar el archivo B. Debido a esto, llegué a la conclusión de que el archivo de carga del subproceso A tiene, de alguna manera mística, una prioridad más alta que el archivo de carga de subprocesos B.

Aquí está el fragmento de código utilizado para la carga:

File file = fileChooser.showOpenDialog(stage);
Document doc;

private class ReadXmlTask extends Task<Void> {
    @Override
    protected Void call() {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            doc = db.parse(file);
        } catch ...

        return null;
    }
}

Thread thread = new Thread(new ReadXmlTask());
thread.setDaemon(true);
thread.start();

No importa si setDaemon() se establece a falseor true.

Entonces mi pregunta es: ¿De dónde viene el tiempo de ejecución diferente? ¿Y hay alguna forma de establecer algún tipo de prioridad para un subproceso de trabajo en comparación con el subproceso de la aplicación JavaFX?

preguntado el 19 de mayo de 14 a las 15:05

¿Podría crear un pequeño programa de prueba sin GUI que cargue los archivos y mida los tiempos sin ninguna influencia de subprocesos múltiples? ¿El tiempo de carga es el mismo que cuando se carga con el programa GUI? -

Tonto de mí para no hacer esto antes de hacer la pregunta. Promedié el tiempo de ejecución en 10 ejecuciones y Archivo A necesario ~4s, archivo B tardó ~18 segundos en cargarse... Entonces, después de todo, este comportamiento no tiene nada que ver con JavaFX. Gracias por darme la pista. -

0 Respuestas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.