首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的应用程序在IntelliJ中比命令行运行得更快?

为什么我的应用程序在IntelliJ中比命令行运行得更快?
EN

Stack Overflow用户
提问于 2011-08-18 16:52:45
回答 6查看 3.5K关注 0票数 13

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

同样的测试,用mvn clean test -Dtest=MyTest中运行34分钟

我们将调用/bin/sort对文件进行排序。这种情况似乎需要更长的时间。我不明白有什么不同。

看看它与IntelliJ一起运行的

代码语言:javascript
运行
复制
/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上,所有的类都是使用Spring注入的。有什么可能的建议是理论的背后是什么背后的性能提高在IntelliJ?测试是一样的。我不能分享所有的代码,因为有太多的代码。但如果需要的话我可以补充任何细节。

这是我的主要课程,以及我如何运行这两门课。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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]

排序命令是

代码语言:javascript
运行
复制
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+ mins。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-22 20:22:49

谢谢大家的帮助。事实证明,IntelliJ从LANG=C开始排序。Mac终端默认在UTF8中进行排序,这说明了性能损失的原因。希望这个答案能帮助到一些人。

票数 11
EN

Stack Overflow用户

发布于 2011-08-18 17:03:13

mvn clean正在对项目进行重建吗?这难道不是一个好主意吗?用Maven构建项目是否需要18分钟(考虑到Maven是绝对的坑,我也不会感到惊讶)?

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

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

票数 1
EN

Stack Overflow用户

发布于 2011-08-19 17:33:55

一个更有根据的答案:

很大程度上可能依赖于I/O缓冲。排序超过500 K记录将输出大量数据,因此正确的缓冲区大小可能非常重要。我认为tty通常是行缓冲的,所以它将执行500 K的读写操作,IDE可能只是在更大的缓冲区中读取。

此外,OSX可能有进程或I/O调度,这极大地支持GUI应用程序而不是控制台应用程序(可以通过绑定到tty来检测),因此您可能需要等待&空闲的时间要比在IDE中的时间长得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7111127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档