Kotlin использует утверждения времени выполнения для проверки нуля – служебные накладные расходы?

Я рассматриваю Kotlin для рамки моделирования и заметил, что компилятор переплетает статические checkParameterIsNotNull вызовы после каждого метода, к которому можно получить доступ из java. Это проверяет, не имеет ли параметр метода значение null, обращаясь (и откачивая?) Стек вызовов каждый раз при запуске этого метода. Теперь, когда в типичной симуляционной структуре количество прогонов может быть в миллионах, я задаюсь вопросом о влиянии производительности такой функции.

Если есть возможность отключить его?

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

Утверждения не генерируются для частных методов (потому что они не могут быть вызваны из Java-кода, а компилятор Kotlin гарантирует, что код Kotlin, вызывающий метод, не пропускает никаких нулевых значений). Поэтому лучший способ избежать накладных расходов – написать внутренний цикл вашего кода моделирования, используя частные методы.

Вы можете отключить генерацию утверждений с помощью -Xno-param-assertions и -Xno-call-assertions для компилятора командной строки. Обратите внимание, что эти параметры не поддерживаются и могут быть удалены в будущем.