我使用Kotlin和最新版本的Eclipse 2个月,在我的Windows 10计算机上没有任何性能问题.现在,我想在最近的OSX计算机上进行关于Kotlin的实时编码会话,其中包括intelliJ(因为它是JetBrains语言......)我刚刚安装并且从未使用过的终极版本.这两台计算机具有良好的硬件,并不限制我的测试.
我的问题是每次我的Kotlin代码都有修改时,编译时间在8秒到35秒之间.我在极简主义代码上做了我的测试:
class TestKotlin {
var a = 1
}
Run Code Online (Sandbox Code Playgroud)
如果我更改变量"a"并因此需要再次构建,则在最佳情况下总是需要8秒才能完成编译.
由于我想用很多小函数和编译进行实时编码会话,这种延迟太有意义了.观众需要等待很多才能在每次编辑时看到结果,他们在逻辑上期望IntelliJ工具具有良好的性能.
在同一个项目中,我尝试使用相同类型的Java类(具有单个属性)并修改其属性以便触发编译,并且编译时间不到1秒.
我尝试在命令行中手动编译代码:
kotlinc hello.kt -include-runtime -d hello.jar
java -jar hello.jar
Run Code Online (Sandbox Code Playgroud)
我有一些不错的编译时间,即使它接近3秒.
当我在编译Kotlin代码时查看IntelliJ中的"消息"屏幕时,我可以看到:
Information:Kotlin: Kotlin JPS plugin version 1.0.6-release-127
Information:Kotlin: Using kotlin-home = /Users/myUsername/Library/Application Support/IntelliJIdea2016.3/Kotlin/kotlinc
Run Code Online (Sandbox Code Playgroud)
它在这里停止所有编译时间,然后几乎立即执行下一步:
Information:Kotlin: Kotlin Compiler version 1.0.6-release-127
Information:17/01/17 11:38 - Compilation completed successfully in 11s 639ms
Run Code Online (Sandbox Code Playgroud)
也许在IntelliJ的配置或类似的东西中存在问题.我很难找到可以改善表演的东西,但没有任何帮助我...
如果有人可以帮我在Eclipse中像在Intellij中使用Kotlin那样有一些现实的编译时间,我将非常感激!
假设你做的很简单:
public class Main {
public static void main(String[] args) {
long started = System.currentTimeMillis();
try {
new URL(args[0]).openConnection();
} catch (Exception ignore) {
}
System.out.println(System.currentTimeMillis() - started);
}
}
Run Code Online (Sandbox Code Playgroud)
现在使用http:// localhost as 运行它args[0]
它需要~100 msec完成.
需要5000+ msec.
现在在linux或docker中运行相同的东西:
~100 msec~350 msec为什么是这样?为什么平台之间有这么大的差异?你能为这个做什么?
对于长时间运行的应用程序服务器和具有自己长而重的初始化序列的应用程序,这5秒可能无关紧要.
然而,有很多应用程序,这个最初的5秒"挂起"很重要,可能会令人沮丧......
给定以下生成a的代码片段,UUID.randomUUID()我得到以下性能结果(以毫秒为单位):
public static void main(String[] args) {
long tmp = System.currentTimeMillis();
UUID.randomUUID();
tmp = printDiff(tmp);
UUID.randomUUID();
tmp = printDiff(tmp);
UUID.randomUUID();
tmp = printDiff(tmp);
UUID.randomUUID();
tmp = printDiff(tmp);
}
private static long printDiff(final long previousTimestamp) {
long tmp = System.currentTimeMillis();
System.out.printf("%s%n", tmp - previousTimestamp);
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
结果:
971
6
0
0
Run Code Online (Sandbox Code Playgroud)
JDK: 1.8 操作系统: Windows 7
为什么只有初始通话需要这么长时间?(将近1秒!)