Есть ли затраты производительности для пустых методов в Kotlin? - PullRequest
1 голос
/ 04 марта 2020

В Kotlin есть затраты на производительность для пустых методов или они игнорируются?

Я запустил следующий тестовый код, и стоимость кажется незначительной:

fun emptyMethod() {}

for(max in listOf(1000, 10000, 100000, 1000000)){
    val start = Instant.now().toEpochMilli()
    for(i in 0..max) {
        emptyMethod()
    }
    val millis= Instant.now().toEpochMilli() - start
    println("$max iterations: $millis millis.")
}

// 1000 iterations: 0 millis.
// 10000 iterations: 0 millis.
// 100000 iterations: 4 millis.
// 1000000 iterations: 10 millis.

Я делаю проверку и хочу использовать пустой метод для документирования (например, petName.mayBeNull()), чтобы избежать гниения будущих комментариев.

1 Ответ

3 голосов
/ 04 марта 2020

В байт-коде JVM Kotlin будет по-прежнему присутствовать вызов пустой функции.

Обычно компиляторы, генерирующие байт-код JVM, не запускают низкоуровневую оптимизацию, такую, как вы предполагали, потому что:

  • полезно для сохранения байт-кода закрыть к структуре исходного кода для целей отладки
  • JIT-компиляторы в реализациях JVM и AOT-компиляторах намного лучше при низкоуровневых оптимизациях, тем более что они могут учитывать конкретную архитектуру

Таким образом, будет ли вызов пустой функции иметь нулевую стоимость во время выполнения, определяется реализацией используемой среды выполнения JVM (или компилятора AOT).

Вы можете попытаться получить разборку из JIT-скомпилированный код во время выполнения, но способ сделать это - указать c для вашей реализации JVM. Например, с OpenJDK это можно сделать с помощью -XX:PrintAssembly option , на который ссылаются в этом Q & A: Disassemble Java JIT-скомпилированный собственный байт-код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...