为什么与命令行相比,我的应用程序在 IntelliJ 中的运行速度更快?

2022-09-04 21:28:11

我们有一个应用程序,通过拆分数据并对其进行排序来导入大量文件。运行 JUnit 测试用例时,整个过程大约需要 16 分钟

相同的测试,在34分钟内完成运行。mvn clean test -Dtest=MyTest

我们正在打电话对文件进行排序。这种排序似乎需要更长的时间。我不明白有什么不同。/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分钟

更新

我运行了所有内容,排序仍然需要超过5分钟。/Library/Java/JavaVirtualMachines/1.6.0_26-b03-383.jdk/Contents/Home/bin/java


答案 1

谢谢大家的帮助。事实证明,IntelliJ 开始排序时带有 。Mac OS X终端默认排序,其中解释了性能损失。希望这个答案能帮助别人。LANG=CUTF8


答案 2

是否正在重建项目?IDEA下的运行没有这样做吗?使用Maven构建项目是否需要18分钟(如果是这样,我不会感到惊讶,因为Maven是绝对的坑)?mvn clean

如果所有这些问题的答案都是“是的”,那么我认为你有一个结论。

解决办法是把Maven带到树林里,射杀它,然后把它埋在一个没有标记的坟墓里。


推荐