Запуск kotlin через JSR-223 невероятно медленный

Я запускаю следующий код, и его выполнение занимает от 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"
}

person L Morris    schedule 13.02.2018    source источник
comment
Из того, что я видел, во время первого вычисления выражения происходит дорогостоящая инициализация, а последующие вызовы происходят намного быстрее.   -  person hotkey    schedule 14.02.2018
comment
Я бегу в ту же медлительность. Первый eval кажется более длинным, чем более поздние eval, но более поздние eval по-прежнему ошеломляюще медленны, даже если выражение равно 1 + 1.   -  person silentorb    schedule 28.02.2018


Ответы (2)


Я сравнил kotlin и groovy, оба предварительно скомпилированы: engine.compile(script)

Выполнение скрипта kotlin через jsr223 в сто раз медленнее скрипта groovy.

person kentchenj    schedule 19.09.2018
comment
Есть ли sciptEngine для Kotlin в groovy? Можете ли вы добавить ресурс, пожалуйста. Я не мог найти что-то. - person Imran; 06.01.2020

Двигатель загружается лениво, поэтому вы в основном измеряете время загрузки двигателя. Перед запуском теста попробуйте сделать следующее.

val engine = ScriptEngineManager().getEngineByExtension("kts")
assert(engine.eval("true") as Boolean)

Кроме того, вы должны сделать цикл вокруг несколько раз, чтобы получить более точную меру. Также вы можете предварительно скомпилировать, чтобы сделать это быстрее. Также для реального кода вы можете вернуть лямбду, чтобы вам не приходилось каждый раз оценивать.

person lfmunoz    schedule 01.04.2020