Альтернатива классу Math для поплавков

Будет генерировать проблемы производительности с использованием функций этого стиля ?:

*fun sqrt(x: Float) = Math.sqrt(x.toDouble()).toFloat()* *fun cos(angle: Float) = Math.cos(angle.toDouble()).toFloat()* *fun sin(angle: Float) = Math.sin(angle.toDouble()).toFloat()* 

для его использования с помощью Floats:

 *sqrt(45.0f)* *cos(1.58f)* *sin(0.28f)* 

вместо гораздо более многословного:

 *Math.sqrt(45.0f.toDouble()).toFloat()* *Math.cos(1.58f.toDouble()).toFloat()* *Math.sin(0.28f.toDouble()).toFloat()* 

Приветствия и благодарности заранее

В использовании оберток не должно быть проблем с производительностью.

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

Если вы используете обертки в горячем коде, вы можете их встроить:

 inline fun sqrt(x: Float) = Math.sqrt(x.toDouble()).toFloat() 

Для встроенных функций байтовый код не отличается от того, который генерирует Java.

Я думаю, что нет проблемы с использованием класса Math . В более ранних версиях Android существовал класс android.util.FloatMath, который обрабатывает арифметику float, но общий класс Math выполняется быстрее, и класс устарел.

Исторически эти методы были быстрее, чем эквивалентные двойные математические методы. В версиях Android с JIT они стали медленнее и с тех пор были повторно реализованы для переноса вызовов в Math. Математика должна использоваться в предпочтении. Все методы были удалены из общедоступного API в версии 23.

http://developer.android.com/reference/android/util/FloatMath.html

Насколько я понимаю, производительность измеряется сложностью алгоритма.
Алгоритм над массивом из n элементов, выполняющий по 1 операции на каждом, называется сложностью O (n).
Такая же сложность алгоритма, выполняющая 3 операции для каждого элемента, по-прежнему равна O (n)
Фиксированная операция, например .toFloat или .toDouble() , не повлияет на производительность, поскольку это сложность O (1).

На самом деле, пытаясь:

 var iniTemp = System.currentTimeMillis() for (i in 1..10000000) sqrt(755.369f) d((System.currentTimeMillis() - iniTemp).toString()) 

407 milisecs

а также:

 var iniTemp = System.currentTimeMillis() for (i in 1..10000000) Math.sqrt(755.369f.toDouble()).toFloat() d((System.currentTimeMillis() - iniTemp).toString()) 

317 милисек

как в более раннем Nexus 7

благодаря

Intereting Posts
Как вызвать конструктор родового типа в конструкторе класса Android w / Kotlin pure-java-Junit NoClassDefFoundError обходной путь не работает Как сортировать на основе / сравнивать несколько значений в Котлин? Разделить строку на каждый n символов Kotlin – Бросить пользовательское исключение Как я могу проверить метод, который не вызывается для объекта без макета? Возврат из функции в Kotlin как однострочный, когда объект равен нулю Kotlin Ktor не может получать данные с данными о местоположении При использовании Java / Kotlin для программирования рекомендуется использовать рекурсию хвоста или итерационную версию? Есть ли разница в производительности? Использование сторонних пользовательских интерфейсов с TornadoFX Как решить: «Не удается найти getter для атрибута« android: text »при реализации двусторонней привязки данных к пользовательскому представлению? Можете ли вы использовать объект, который синхронизирован как блокировка Kotlin – как передать нулевое значение в фрагменты метода newInstance? Запечатанный класс данных в Котлине Вызов конструктора в kotlin с использованием vararg