Kotlin Встроенная функция в SceneRenderer - PullRequest
1 голос
/ 17 февраля 2020

Если в рендере используется встроенная функция l oop, будет ли какой-либо выигрыш в производительности?

class SceneRenderer(val f: () -> Unit): GLSurfaceView.Renderer {
  override fun onSurfaceCreated(glUnused: GL10, config: EGLConfig) { ... }

  override fun onSurfaceChanged(glUnused: GL10, width: Int, height: Int) { ... }

  override fun onDrawFrame(glUnused: GL10) {
    ...
    inlineFun(f)
    ...
  }

  private inline fun inlineFun(f: () -> Unit) {
    f.invoke()
  }
}

Или достаточно прямого вызова функции?

override fun onDrawFrame(glUnused: GL10) {
  ...
  f.invoke()
  ...
}

Заранее спасибо!

1 Ответ

1 голос
/ 17 февраля 2020

TL; DR

Или достаточно прямого вызова функции?

Да, это так.

Встроенный

Kotlinlang :

Использование функций более высокого порядка налагает определенные штрафы времени выполнения: каждая функция является объектом, и она захватывает замыкание, то есть те переменные, к которым осуществляется доступ в теле функции. Выделение памяти (как для объектов-функций, так и для классов) и виртуальные вызовы приводят к накладным расходам во время выполнения.

Ваша функция не высокого порядка, поскольку она находится внутри класса SceneRenderer и не окажет разумного влияния делая это inline.

Встраивание может привести к росту сгенерированного кода; однако, если мы сделаем это разумным образом (т.е. избегая встраивания больших функций), это окупится производительностью, особенно на «мегаморфных» c 'колл-сайтах внутри циклов.

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