Лучше привести целое выражение или просто переменную другого типа - PullRequest
3 голосов
/ 05 февраля 2011

Я использую поплавки для некоторых игровых графических образов Android Java, но все триггерные функции библиотеки Math возвращают значение double, поэтому я должен явно привести их.

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

например. что лучше:

screenXf = (float) (shipXf + offsetXf * Math.sin(headingf) - screenMinXf);

или

screenXf = shipXf + offsetXf * (float) (Math.sin(headingf)) - floatScreenMinXf;

Я полагаю, что другие вопросы будут звучать так: «Как я могу проверить это на эмуляторе, чтобы другие факторы (например, службы ПК) не запутали проблему? и «Будет ли оно по-разному на другом оборудовании?»

О, дорогой, это три вопроса. Жизнь никогда не бывает простой: - (

-Frink

Ответы [ 2 ]

1 голос
/ 05 февраля 2011

Попробуйте вместо этого использовать FloatMath.sin () .

FloatMath

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


Но обратите внимание на эту ошибку в документах Android:

http://developer.android.com/guide/practices/design/performance.html#avoidfloat

Проектирование для производительности
...
С точки зрения скорости, нет никакой разницы междуплавать и удваиваться на более современном оборудовании.По пространству double в 2 раза больше.Как и в случае с настольными компьютерами, предполагая, что пространство не является проблемой, вы должны предпочесть double плавающему.

Хотя этот парень @fadden, предположительно один из парней, который написал ВМ, говорит:

Почему в API Android так много поплавков?

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

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

Его последнее предложение («страница ... нужно»быть обновленным ") относится к странице, на которую я ссылался выше, поэтому мне интересно, имеет ли он в виду это предложение о" без разницы ", которое я цитировал выше.

1 голос
/ 05 февраля 2011

Это определенно зависит от HW.Я ничего не знаю о целевых платформах, но на текущем ПК это занимает столько же времени, в то время как на i386 числа с плавающей запятой примерно вдвое превышают удвоенные.Не поймите это, так как HW вашего ПК имеет мало общего с HW целевой платформы.Когда целевой платформой был ваш ПК, я бы порекомендовал http://code.google.com/p/caliper/ для этого микробенчмарка.

...