我正在运行以下代码,并且需要3到6秒才能在OSX(Sierra)和Windows 10上执行。我从来没有看到使用JSR-223这么慢,特别考虑到评估内容的简单性。通过YourKit中的调用树进行挖掘,似乎大部分时间都花在了KotlinJsr223JvmLocalScriptEngine.getReplEvaluator上,但是我无法看到它。
这是使用jdk1.8.0_71和kotlin 1.2.10。
有什么想法吗?
由于
import javax.script.ScriptEngineManager
fun main(args: Array<String>) {
System.setProperty("idea.io.use.fallback", "true") // need this on windows, not required on osx it seems!
val engine = ScriptEngineManager().getEngineByExtension("kts")!!
val startTime = System.currentTimeMillis()
engine.eval("val x = 5")
println(System.currentTimeMillis() - startTime)
}
我的构建脚本如下:
buildscript {
ext.kotlin_version = '1.2.10'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
group 'xxx'
version '1.0-SNAPSHOT'
apply plugin: 'kotlin'
repositories {
mavenCentral()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
compile "org.jetbrains.kotlin:kotlin-script-util:$kotlin_version"
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
答案 0 :(得分:2)
我比较了kotlin和groovy,它们都是预先编译的:engine.compile(script)
通过jsr223执行kotlin脚本比使用Groovy脚本慢一百倍。
答案 1 :(得分:0)
引擎是延迟加载的,因此您基本上是在测量引擎的加载时间。在运行测试之前,请尝试执行以下操作。
val engine = ScriptEngineManager().getEngineByExtension("kts")
assert(engine.eval("true") as Boolean)
此外,您应该循环几次以获得更好的度量。您也可以预编译以使其更快。同样对于真实代码,您可以返回一个lambda,因此您不必每次都求值。