Процессор Android: двойной, целые числа имеет значение, как я рассчитать? Что быстрее в конкретных случаях? - PullRequest
3 голосов
/ 01 марта 2012

Я занимаюсь разработкой игры для Android. На данный момент я пишу код, который должен рассчитать лучший маршрут между двумя объектами, используя алгоритм A *. Внутри алгоритма я использую двойники, чтобы вычислить все.

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

Вопрос первый:

Может ли такое поведение наблюдаться на телефонах Android? Я знаю, что на моем компьютере установлено несколько ALU для целых чисел с плавающей запятой и т. Д. Но как насчет телефонов? Телефоны на Android могут сильно отличаться, если говорить об аппаратном обеспечении. У меня есть только два тестовых телефона, но сегодня на рынке доступны сотни телефонов, что означает, что проведение тестов на двух моих телефонах не даст мне надежных данных, по крайней мере, так я думаю.

Вопрос второй:

Для моей игры не имеет значения, если я переключусь на Integers, рассчитанный маршрут может быть менее идеальным, но это не беспокоит меня. Так стоит ли переходить на целые числа? Или переключение на целые числа нарушит алгоритм? У кого-нибудь есть опыт с этим?

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Как правило, целочисленная арифметика быстрее, чем арифметика с плавающей запятой, потому что ее проще реализовать.(С плавающей запятой, аппаратное обеспечение должно иметь дело как с мантиссой, так и с экспонентой, и (AFAIK) оно не может делать это параллельно.)

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


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

Или вы, ребята, думаете, что переключение на целые числа нарушит алгоритм?

Это может сработать.Это также может сделать их намного сложнее.Все зависит от характера алгоритмов.Конечно, вас ждет много перекодирования и повторного тестирования.

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

2 голосов
/ 01 марта 2012
1 голос
/ 01 марта 2012

Целочисленная арифметика имеет несколько преимуществ:

  • Обычно это быстрее. Это зависит от аппаратного обеспечения, но большинство аппаратных средств имеет более эффективные целочисленные операции. Также некоторым аппаратным средствам не хватает возможностей FPU, и на самом деле имитировать инструкции с плавающей запятой, которые намного медленнее.
  • Вам не нужно беспокоиться о проблемах округления. Неточность с плавающей точкой может вызвать некоторые тонкие ошибки и проблемы.
  • Это проще - вам не нужно беспокоиться об особых случаях, таких как NaN и Infinity, и легче отображать / форматировать числа.

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

Чтобы ответить на ваши конкретные вопросы:

  1. У вас нет гарантии относительно аппаратной поддержки на телефонах Android. На современных телефонах поддержка FPU возможна, но на нее нельзя положиться. Поэтому используйте целые числа, если можете.
  2. A * pathfinding отлично работает с целыми числами, предполагая структуру данных в виде сетки и положительные целочисленные затраты на перемещение. Таким образом, вы сможете легко переключаться на целые числа, и это, вероятно, будет быстрее. Обратите внимание, что вам может потребоваться соответствующим образом увеличить стоимость перемещения, поэтому вместо стоимости перемещения 1,0 за квадрат вы можете, например, сделать это 100. Но кроме этого алгоритм должен быть таким же.
...