Почему там столько плаваний в API Android?

Тип с плавающей точкой по умолчанию в Java является двойным. Если Вы трудно кодируете константу как 2.5 в Вашу программу Java делает это двойным автоматически. Когда Вы делаете операцию на плаваниях или ints, который мог потенциально извлечь выгоду из большей точности, тип 'продвинут' на двойное.

Но в API Android, все, кажется, плавание от громкости звука до прямоугольных координат. Существует названная структура RectF используемый в большей части рисунка; F для плавания. Это - действительно боль для программистов, которые бросают продвинутый, загибает к (float) довольно часто. Разве все мы не соглашаемся, что код Java является грязным и достаточно подробным, как это?

Обычно математические сопроцессоры и акселераторы предпочитают дважды в Java, потому что он соответствует одному из внутренних типов. Есть ли что-то о Дальвике Android VM, который предпочитает плавания по некоторым причинам? Или все плавания являются просто результатом извращения в дизайне API?

16
задан Brian 19 March 2010 в 06:56
поделиться

5 ответов

В зависимости от ЦП не будет блока с плавающей запятой (FPU). Таким образом, он должен имитировать FPU в программном обеспечении. это быстрее для Float, чем для Double. Или, если у устройства есть FPU, вероятно, он будет быстрее с поплавками.

8
ответ дан 30 November 2019 в 15:17
поделиться

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

Помните, однако, что нет необходимости использовать приведение. Просто добавьте F к вашему литералу (так 2.5 станет 2.5f). Я не знаю, достаточно ли умён компилятор, чтобы сделать следующую замену за вас, но если нет, то это также сделает ваш код немного более эффективным.

Рассмотрим

float x = (float) 2.5;

и

float x = 2.5f;

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

1
ответ дан 30 November 2019 в 15:17
поделиться

Для метрик, не требующих большого количества значащих цифр (например, смещения экрана), было бы неэффективно использовать doubles вместо floats. Максимально эффективное использование памяти жизненно важно на мобильных устройствах, где практически все ресурсы на высоте. А при работе с такими объектами, как Rects - которые потенциально могут быть выделены тысячами - сокращение лишних битов имеет решающее значение.

Я уверен, что есть и другие причины :-)

7
ответ дан 30 November 2019 в 15:17
поделиться

Странно. Designing for Performance в руководстве, кажется, говорится: "....Обычной практикой в настольных системах является свободное использование плавающей точки...... поэтому все операции над "float" и "double" выполняются программно...." на http://developer.android.com/guide/practices/design/performance.html#avoidfloat

Это может иметь некоторый смысл: "....Инструкции не ограничиваются безвозмездно определенным типом. Например, инструкции, которые перемещают 32-битные значения регистра без интерпретации, не должны указывать, перемещают ли они ints или floats.....". at http://www.netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html

3
ответ дан 30 November 2019 в 15:17
поделиться

На устройствах без FPU операции с плавающей запятой одинарной точности намного быстрее, чем эквиваленты двойной точности. По этой причине платформа Android предоставляет класс FloatMath, который реплицирует некоторые функции java.lang.Math, но с аргументами типа float вместо double.

На последних устройствах Android с FPU время, необходимое для операций с одинарной и двойной точностью, примерно одинаково и значительно быстрее, чем при программной реализации. (Страница «Designing for Performance» была написана для G1, и ее необходимо обновить, чтобы отразить различные изменения.)

Между прочим, написание «2.5f» или «(float) 2.5» не имеет значения. В любом случае javac знает, что вам нужна константа с плавающей запятой одинарной точности, и это то, что он генерирует. Вы можете проверить это, написав образец программы и изучив сгенерированный байт-код.

43
ответ дан 30 November 2019 в 15:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: