C’è un modo per compilare / caricare file fxml più velocemente e solo una volta, e non ad ogni riavvio di un’applicazione?

Ho un programma che carica molti file fxml quando viene eseguito. L’applicazione verrà completata in breve tempo e il caricamento dell’applicazione richiederà troppo tempo.

Ci sono molti file fxml (20+) e tutti questi file fxml sono caricati con codice Java. Ci sarà un punto in cui l’applicazione è finita e pronta per l’uso, ma tutti i file verranno caricati con ogni esecuzione del programma. I file fxml possono essere compilati una sola volta, perché non verranno modificati al termine?

Il codice java sarà ovviamente compilato una volta, sono solo i file fxml. L’applicazione richiede ora 25 secondi per iniziare, con 14 secondi che caricano il file fxml.

C’è un modo per rendere tutto più veloce?

MODIFICA # 1:

Esistono strumenti forniti gratuitamente e che velocizzano l’esecuzione delle applicazioni (Java)? O il tempo di esecuzione dipende semplicemente dal modo in cui il programma è scritto?

Quali schemi di progettazione possono aiutare a fissare i tempi di esecuzione della tua applicazione?

MODIFICA # 2:

Il seguente codice spiegherà il mio problema in poche parole:

package main; ....... ....... public class MainClass { .... .... List controllerList; public mainClass(List controllerList) { this.controllerList = otherClass.getControllerList(); loadFXMLFiles(); } public void loadFXMLFiles() { for(InformationController controller : controllerList) { controller.loadFXML(); } doOtherStuff(); } .... } 

Tutti questi InformationController hanno anche il loro caricamento di altri file fxml, quindi è in realtà un albero di file fxml che viene caricato. Questo è caricato ad ogni avvio dell’applicazione, quindi c’è un modo per fare questo caricamento solo una volta forse?

Come accelerare le prestazioni FXML

Farò questa risposta al wiki della comunità, se qualcun altro ha altre idee, per favore modificalo e aggiungili.

  1. NON si dovrebbe usare lo statico FXMLLoader.load() ma dovrebbe invece creare un’istanza di FXMLLoader e riutilizzare quella usando il metodo loader.load() dell’istanza. Il motivo è che le cache di FXML-Loader, ad esempio le ricerche di class, sono quindi più veloci nel caricare il prossimo file FXML.
  2. Utilizzare uno strumento per compilare FXML in Java, ad esempio il compilatore FXML di Tom Schindl o il convertitore da FXML a Java NetBeans .
  3. Non caricare più FXML di quanto sia necessario in un dato momento, ad esempio se non lo si sta visualizzando in questo momento, non caricarlo.
  4. Carica l’FXML in un thread in background (non funziona con alcuni tipi di controllo, ad esempio Tooltip, in Java 8).
  5. Carica prima un login iniziale o una schermata iniziale e poi carica il resto del FXML mentre è visualizzata la schermata iniziale o di accesso. Carico FXML in alcune app dopo che le credenziali sono state accettate nella schermata di accesso.
  6. Riduci la complessità dell’interfaccia utente dell’applicazione rimuovendo i nodes non necessari.
  7. Assicurati di non svolgere lavori non necessari (ad esempio leggendo un database) sul thread dell’interfaccia utente JavaFX nei metodi di inizializzazione dei controller.
  8. La documentazione di FXMLLoader.load() in JavaFX 8 include un riferimento ai modelli FXML, ma non penso che sia mai stata implementata, quindi forse non ti aiuterà.
  9. Ho sentito dire che il riferimento ai metodi statici di FXML è lento.
  10. Utilizzare l’ ultima versione di sviluppo di JavaFX .
  11. Una volta caricata una gerarchia di nodes da FXML, riutilizzare la gerarchia in seguito, piuttosto che buttarla via e caricarne una nuova (ad esempio se si ha una finestra di dialogo con contenuti costruiti usando FXML, quando l’utente chiude la finestra di dialogo, basta nasconderlo e quando è necessario mostrare nuovamente una finestra di dialogo simile, mostrare semplicemente la finestra di dialogo nascosta piuttosto che build una finestra di dialogo e un grafico di scena completamente nuovi).

La riflessione è il motivo per cui FXML è lento

Penso che il motivo principale per cui l’implementazione FXML di Java 8 sia lenta è che si basa molto sul riflesso e la riflessione è lenta come descritto nel tutorial di riflessione :

Poiché la riflessione riguarda tipi risolti dynamicmente, non è ansible eseguire determinate ottimizzazioni della macchina virtuale Java. Di conseguenza, le operazioni di riflessione hanno prestazioni più lente rispetto alle controparti non riflettenti e dovrebbero essere evitate in sezioni di codice chiamate frequentemente in applicazioni sensibili alle prestazioni.