2012-06-06 11 views
6

Ho un programma java che legge molti dati di input da un database, lo manipola, quindi scrive i dati su un altro database (usando driver ODBC, Excel e accesso ai database, su un nuovo computer con Windows 7). Il programma impiega circa 17 minuti per essere eseguito da Eclipse, ma quando ho creato un file .jar eseguibile ci vogliono 10 minuti in più per l'esecuzione (27 totali).Perché il mio file .jar è più lento del programma in eclissi?

I due motivi che ho trovato finora per i file jar lenti (cercando SO e Google) sono che sono compressi e che richiede molto più tempo per scrivere al prompt dei comandi (o al log degli errori) rispetto al console in eclissi. Ho provato a creare un file jar non compresso e ha accelerato solo di circa 10 secondi (il che poteva essere del tutto casuale, poiché i tempi di esecuzione variano comunque di circa 30 secondi). Ho solo circa 10 comandi System.out.println() nel programma, quindi non dovrebbe rallentarlo molto.

Qualche idea su cosa sta causando un funzionamento molto più lento e se è possibile accelerarlo di nuovo? Fammi sapere se ci sono altri dettagli che potrebbero essere rilevanti che dovrei includere. Grazie!

+2

Hai provato a rimuovere completamente tutti i comandi System.out.println()? La stampa sulla console consuma molta velocità. –

+3

Suggerisco di utilizzare la libreria logger o log4j per stampare i messaggi di registro e puoi usare il timestamp per vedere quale parte del codice sta creando il collo di bottiglia. Questa non è una soluzione concreta, ma dovrebbe aiutare a restringere il problema. – user845279

+0

D'accordo con @Lai Xin Chu. Ma se è difficile rimuovere tutte le stampe basta eseguire il programma e reindirizzare STDOUT su file. Non credo che la console di Eclipse possa funzionare più lentamente della shell. – AlexR

risposta

4

Utilizzare JAMon. È una libreria di monitoraggio, che ti aiuterà a misurare i tempi di esecuzione del tuo codice.

Dopo aver aggiunto un codice di monitoraggio ai propri metodi, eseguirlo in Eclipse e come file JAR e confrontare i risultati. Questo dovrebbe consentire di restringere la ricerca.

Inoltre: verificare se si sta eseguendo il file JAR, con la stessa versione java, utilizzata da Eclipse (ad esempio Java 1.4.x potrebbe essere molto più lento di 1.6.x).

1

È possibile controllare i parametri della VM Java (come GC utilizzato, memoria massima, ecc.). Per le applicazioni ad alta intensità di dati, GC potrebbe rallentare molto le cose.

2

Nel mio caso, la mia applicazione ha impiegato 3 secondi per funzionare su Eclipse mentre ci sono voluti 2 minuti quando l'ho eseguita da jar.
L'errore era scegliere "Package required libraries into jar" durante l'esportazione del mio progetto in jar eseguibile.

ho cercato diversi modi per abbattere il tempo, ma non serviva a niente, tranne ..

Se avete altre dipendenze Maven o file jar nel progetto, è necessario utilizzare "**Extract required libraries into generated jar**" durante l'esportazione del progetto in un vaso .

Questo problema risolto in pochi secondi & ora il mio file di eclissi & jar sta impiegando lo stesso tempo per eseguire l'applicazione, 2 secondi.

Spero che questo aiuti i nuovi lottatori.

Saluti.

+1

stesso qui, correre in eclissi andava bene (quasi istantaneamente), nel barattolo il processo era 4 minuti indietro. il tuo suggerimento ha risolto il mio problema – benez

2

Ho avuto un problema simile. La shell stava eseguendo ordini di grandezza più lenti e non aveva nulla a che fare con l'output della console. Ho provato a impostare valori di memoria JVM ma non ha fatto alcuna differenza

La soluzione era di impacchettare il file ANT con tutti i JAR in una cartella esterna, usando "Copia le librerie richieste in una sottocartella accanto al generato" JAR "nella procedura guidata" Esegui esportazione file JAR eseguibili ". Quindi eseguire il JAR principale con un'opzione da riga di comando -cp [YOURSUBFOLDER].

+0

Grazie per questo! Apparentemente questo ha anche un enorme impatto sulla classe FXMLLoader di JavaFX, facendolo funzionare circa 10 volte più lentamente con un "vaso imballato" e che sebbene i file fossero già decompressi fuori ... – DragonGamer

+0

Lo stesso risultato qui, anche io non l'ho fatto ho bisogno di '-cp', poiché il file manifest specifica già la posizione dei sotto-JAR – golimar

Problemi correlati