当前位置: 首页 > 面试题库 >

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

费凯康
2023-03-14
问题内容

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

同样的测试,mvn clean test -Dtest=MyTest34分钟内 完成运行。

我们正在呼吁/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分钟以上的时间。


问题答案:

谢谢大家的帮助。事实证明IntelliJ从开始LANG=C。Mac OS
X终端默认情况下进行排序,UTF8其中解释了性能下降。希望这个答案可以对某人有所帮助。



 类似资料:
  • 问题内容: 嗨,我正在开发一个需要我运行一些bash代码的应用程序,有没有一种方法可以将脚本硬编码到我的应用程序中然后运行它?例如(这是一个非常简化的示例) 我有以下方法来运行一行bash命令,但需要在多行中运行类似的内容。同样,上面的代码是一个非常简化的示例,我实际上在执行的操作必须通过脚本运行,而不能通过Java完成。我也想对它进行硬编码,因为我知道可以将脚本存储在手机上并使用以下命令运行它,

  • 问题内容: 我通常使用VisualVM对运行的Java应用程序进行概要分析,但它需要X才能在计算机上运行。 我知道我可以通过管理端口进行连接,但这将是一个脱机的概要分析,对我来说还不够。 因此,我正在寻找一种解决方案,可以通过命令行分析正在运行的Java应用程序方法的CPU使用率。对于我来说,在服务器上收集数据就足够了,然后可以在另一台计算机上分析收集的数据。 更新: 看来我需要更具体。我想从命令

  • 发生的情况:spark实例开始运行,在没有bokeh服务器的情况下正常加载。然而,一旦bokeh服务器应用程序启动(即)web页面打开,spark实例关闭。它不会在控制台输出中发回任何错误。产出如下: 2018-11-26 21:04:05 INFO ContextHandler:781-Started O.S.J.S.ServletContextHandler@4f0492c9{/statist

  • 问题内容: 我正在使用IntelliJ 14.1.15运行OSX 10.11。 我有一个将txt文件作为参数的程序。我可以从终端通过 java SearchCmd test.txt 运行它,然后它允许我输入搜索词并搜索该列表。 如何在IntelliJ中执行此操作,以便可以单击“运行”按钮并读取文件,并可以在IntelliJ控制台中输入搜索词。 主类“ SearchCmd”包含main方法,例如:

  • 我有这个命令来编译我的程序。 我创建了以下makefile。 如果从terminal运行该命令将成功,但make将失败。 它将失败,并出现错误 该文件应该在命令中使用导入。 我认为Makefile中的命令执行起来很像bash脚本。 在bash中运行命令和在Makefile中运行命令有什么区别?