2014-06-06 5 views
5

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.C'è un modo per compilare/caricare file fxml più velocemente e solo una volta, e non ad ogni riavvio di un'applicazione?

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?

EDIT # 1:

ci sono strumenti che vengono forniti gratuitamente e che rendono l'esecuzione di applicazioni (Java) molto più veloce? 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 dell'applicazione?

EDIT # 2:

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

package main; 

....... 
....... 

public class MainClass { 

    .... 
    .... 

    List<InformationController> controllerList; 

    public mainClass(List<InformationControllers> controllerList) { 
     this.controllerList = otherClass.getControllerList(); 
     loadFXMLFiles(); 
    } 

    public void loadFXMLFiles() { 
     for(InformationController controller : controllerList) { 
      controller.loadFXML(); 
     } 
     doOtherStuff(); 
    } 

    .... 

} 

Tutte quelle InformationControllers hanno il loro carico di altri fxml file troppo, quindi in realtà è un albero di file fxml che vengono caricati. Questo è caricato ad ogni avvio dell'applicazione, quindi c'è un modo per fare questo caricamento solo una volta forse?

+0

Ci sono modi per renderlo più veloce. Puoi pubblicare un [mcve] (http://stackoverflow.com/help/mcve)? – jewelsea

+0

Mi piacerebbe davvero, ma è un'applicazione closed source e per me è proibito pubblicare il codice corrispondente, o anche una parte di esso, online. C'è forse un altro modo in cui posso fornire maggiori informazioni? E grazie per l'aiuto. – n00b1990

+0

Non è necessario fornire l'origine della propria applicazione, è sufficiente fornire l'origine (un file * minimo * fxml) che dimostra il problema in modo che qualcun altro possa riprodurlo. Controlla anche l'elenco [on-topic] (http://stackoverflow.com/help/on-topic). – jewelsea

risposta

16

su come accelerare fino FXML prestazioni

farò questa risposta della comunità wiki, se qualcun altro ha ulteriori idee, si prega di modificarlo e aggiungerli.

  1. non si dovrebbe utilizzare la statica FXMLLoader.load() ma dovrebbe invece create an instance of FXMLLoader e riutilizzare che uno che utilizza l'istanza loader.load() metodo. Il motivo è che le cache FXML-Loader, ad es. ricerche di classe, e quindi è più veloce caricando il prossimo file FXML.
  2. Utilizzare uno strumento per compilare FXML su Java, ad esempio Tom Schindl's FXML compiler o NetBeans FXML to Java converter.
  3. Non caricare più FXML di quanto sia necessario in un dato momento, ad es. se non lo si sta visualizzando in questo momento, non caricarlo.
  4. Caricare l'FXML in un thread in background (non funziona per alcuni tipi di controllo, ad esempio Tooltip, in Java 8).
  5. Caricare prima un login iniziale o splash screen e quindi caricare il resto del file 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. Riduce la complessità dell'interfaccia utente dell'applicazione rimuovendo i nodi non necessari.
  7. Assicurarsi di non eseguire il lavoro non necessario (ad esempio la lettura di un database) sul thread dell'interfaccia utente JavaFX nei metodi di inizializzazione dei controller.
  8. La documentazione 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 a static methods from FXML è lento.
  10. Utilizzare latest development version of JavaFX.
  11. Una volta caricata una gerarchia di nodi da FXML, riutilizzare la gerarchia in un secondo momento 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 nascondere e quando è necessario mostrare nuovamente una finestra di dialogo simile, basta mostrare la finestra di dialogo nascosta piuttosto che costruire una finestra di dialogo e un grafico di scena completamente nuovi).

riflessione è il motivo per cui FXML è lento

Penso che il motivo principale l'attuazione FXML Java 8 è lento è che si basa così pesantemente sulla riflessione e reflection is slow come descritto nella reflection tutorial:

Poiché la riflessione riguarda i tipi risolti dinamicamente, non è possibile 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.

+2

un punto importante che hai dimenticato e che potresti aggiungere è che NON si deve usare l'FXMLLoader.load() statico ma creare un'istanza di FXMLLoader e riutilizzare quella. Il motivo è che le cache FXML-Loader ad es. ricerche di classe e quindi è più veloce caricando il prossimo file FXML – tomsontom

+0

preso e aggiunto, grazie Tom. – jewelsea

+2

Questo non funziona. Non è possibile riutilizzare la stessa istanza di FXMLLoader per ricaricare altro, o persino lo stesso documento. Avrai tutti i tipi di errori, come fx: id duplicati, root già impostato e così via. Non è pensato per essere usato in questo modo. – sixtstorm1

Problemi correlati