Abbiamo un'applicazione che importa una grande quantità di file suddividendo i dati e ordinandoli. Quando si esegue il test case JUnit, l'intero processo impiega circa 16 minuti.Perché la mia applicazione è più veloce in IntelliJ rispetto alla riga di comando?
Stesso test, eseguito con mvn clean test -Dtest=MyTest
eseguito in 34 minuti.
Stiamo chiamando a /bin/sort
per ordinare i file. Il tipo sembra richiedere più tempo. Non capisco cosa è diverso.
Guardando IntelliJ Corre con
/Library/Java/JavaVirtualMachines/1.6.0_26-b03-383.jdk/Contents/Home/bin/java -Didea.launcher.port=7532 -Didea.launcher.bin.path=/Applications/IntelliJ IDEA 10.app/bin -Dfile.encoding=UTF-8 -classpath %classhpath% com.intellij.rt.execution.application.AppMain com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 xxx.IntTestImportProcess,testImportProcess
Sono su OS X. Tutte le classi vengono iniettati con Primavera. Quali sono alcuni possibili suggerimenti sono le teorie su cosa c'è dietro questo guadagno di prestazioni in IntelliJ? I test sono identici. Non posso condividere tutto il codice perché c'è così tanto. Ma posso aggiungere qualsiasi dettaglio se richiesto.
Ecco la mia classe principale e come sto eseguendo entrambi.
public static void main(String... args) throws IOException {
if(args.length != 2) {
System.out.println("Usage: \n java -jar client.jar spring.xml data_file");
System.exit(1);
}
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(args[0]);
PeriodFormatter formatter = new PeriodFormatterBuilder()
.appendMinutes()
.appendSuffix("minute", "minutes")
.appendSeparator(" and ")
.appendSeconds()
.appendSuffix("second", "seconds")
.toFormatter();
URI output = (URI) applicationContext.getBean("workingDirectory");
File dir = new File(output);
if(dir.exists()) {
Files.deleteDirectoryContents(dir.getCanonicalFile());
}
else {
dir.mkdirs();
}
ImportProcess importProcess = applicationContext.getBean(ImportProcess.class);
long start = System.currentTimeMillis();
File file = new File(args[1]);
importProcess.beginImport(file);
Period period = new Period(System.currentTimeMillis() - start); // in milliseconds
System.out.println(formatter.print(period.toPeriod()));
}
Ho deciso di rimuovere JUnit e di utilizzare solo un metodo main(). Il risultato è esattamente lo stesso. IntelliJ è di nuovo. Ecco il registro pazzo.
Con IntelliJ
DEBUG [ main] 2011-08-18 13:05:16,259 [er.DelimitedTextUnixDataSorter] Sorting file [/Users/amirraminfar/Desktop/import-process/usage]
DEBUG [ main] 2011-08-18 13:06:09,546 [er.DelimitedTextUnixDataSorter] Sorting file [/Users/amirraminfar/Desktop/import-process/customer]
Con java-jar
DEBUG [ main] 2011-08-18 12:10:16,726 [er.DelimitedTextUnixDataSorter] Sorting file [/Users/amirraminfar/Desktop/import-process/usage]
DEBUG [ main] 2011-08-18 12:15:55,893 [er.DelimitedTextUnixDataSorter] Sorting file [/Users/amirraminfar/Desktop/import-process/customer]
Il comando sort è
sort -t' ' -f -k32,32f -k18,18f -k1,1n
Come potete vedere sopra, l'ordinamento in Intellij prendere 1 minuto ma in java -jar richiede 5 minuti!
Aggiornamento
ho corse tutto utilizzando /Library/Java/JavaVirtualMachines/1.6.0_26-b03-383.jdk/Contents/Home/bin/java
e la selezione prende ancora ben più di 5+ minuti.
a quale installazione di Java puntano il comando '' java'' e '' javac''? –
In IntelliJ non funziona più veloce, sta rallentando con Maven! Puoi provare a eseguirlo come una invocazione raw 'java'? –
@hircus/usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java e current è un link simbolico a A. Non ho idea di cosa A sia –