Почему мое приложение работает быстрее в IntelliJ по сравнению с командной строкой? - PullRequest
13 голосов
/ 18 августа 2011

У нас есть приложение, которое импортирует большое количество файлов, разбивая данные и сортируя их.При запуске тестового примера JUnit весь процесс занимает около 16 минут .

Тот же тест, выполненный с mvn clean test -Dtest=MyTest, выполняется в 34 минут .

Мы звоним на /bin/sort, чтобы отсортировать файлы.Вид, кажется, занимает больше времени.Я не понимаю, в чем дело.

Глядя на IntelliJ, он работает с

/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

Я на OS X. Все классы вводятся с помощью Spring.Каковы некоторые возможные предположения о том, что стоит за этим увеличением производительности в IntelliJ?Тесты идентичны.Я не могу поделиться всем кодом, потому что есть так много.Но я могу добавить любую деталь, если потребуется.

Вот мой основной класс и как я выполняю оба.

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()));
    }

Я решил удалить JUnit и просто использовать метод main ().Результат точно такой же.IntelliJ снова.Вот сумасшедший журнал.

С 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]

С 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]

Команда сортировки

sort -t'    ' -f -k32,32f -k18,18f -k1,1n

Как вы можете видеть выше, сортировкав Intellij требуется 1 минута , но в java -jar требуется 5 минут !

Обновление

Я запустил все, используя /Library/Java/JavaVirtualMachines/1.6.0_26-b03-383.jdk/Contents/Home/bin/java и сортировка все еще занимает более 5 минут.

Ответы [ 6 ]

9 голосов
/ 23 августа 2011

Спасибо всем за помощь. Оказывается, IntelliJ начинает сортировку с LANG=C. Терминал Mac OS X по умолчанию сортируется в UTF8, что объясняет потерю производительности. Надеюсь, этот ответ кому-нибудь поможет.

1 голос
/ 19 августа 2011

Предположение больше, чем обоснованный ответ:

Много может зависеть от буферизации ввода / вывода.Сортировка более 500K записей приведет к выводу большого количества данных, поэтому правильный размер буфера может иметь большое значение.Я думаю, что tty, как правило, буферизуется строкой, поэтому он будет выполнять операции чтения и записи по 500 КБ, а среда IDE может просто читать в гораздо больших буферах.O Планирование, которое сильно предпочитает приложения с графическим интерфейсом по сравнению с консольными (которые могут быть обнаружены при привязке к tty), поэтому может оказаться, что вам придется ждать и простаивать с консолью намного больше времени, чем из IDE.

1 голос
/ 18 августа 2011

mvn clean выполняет перестройку проекта?Разве прогон под IDEA не делает этого?Разве создание проекта с Maven займет 18 минут (я не удивлюсь, если бы это было сделано, учитывая, что Maven - это абсолютные ямы)?

Если ответы на все эти вопросы «да», то я думаю,у вас есть заключение.

Решение состоит в том, чтобы отвезти Мэйвена в лес, застрелить его, а затем похоронить в безымянной могиле.

0 голосов
/ 19 августа 2011

Вы пытались использовать профилировщик, такой как VisualVM , чтобы увидеть, что является узким местом?Также сравните графики использования процессора вашего компьютера (на Mac должен быть установлен системный монитор).Возможно, в какой-то момент процесс блокируется и не работает эффективно, что можно рассматривать как график использования ЦП различной формы.

0 голосов
/ 19 августа 2011

mvn, вероятно, запускает JVM с параметрами, отличными от вашей IDE.

Реальные различия между "java -server" и "java -client"? могут вызвать существенные различия впроизводительность для долго работающих приложений, но иногда различия в флагах gc могут вызывать различия в производительности, когда ваше приложение использует память по-разному.

Если ваш процесс связан с памятью и, таким образом, сбрасывается на некотором уровне памяти, флаги кучи, например, -Xmx также может существенно повлиять на производительность.Профилирование памяти может легко исключить это или исключить.

Чтобы диагностировать эти различия, посмотрите на ваши mvn файлы конфигурации, чтобы выяснить, как он запускает JVM, и посмотрите на свою конфигурацию запуска приложения Java IDE.

0 голосов
/ 19 августа 2011

Этот вопрос не совсем правильно определен и далеко не ясен. Вы хотите сказать, что вы прочитали список файлов в папке, используя Java IO, а затем передали его внешнему процессу для сортировки? Звучит немного странно для меня, но в любом случае это должно быть связано с памятью. Подключитесь к обоим приложениям с помощью JConsole и найдите подсказки в диаграммах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...