Самый эффективный способ добавить два числа, которые постоянно растут - PullRequest
0 голосов
/ 17 января 2012

Каков наиболее эффективный способ непрерывного сложения двух чисел?

Например, у меня есть что-то вроде следующего:

totalFloat = totalFloat + someFloatVar

Должен быть более эффективный способ, верно? Эти числа непрерывно складываются, пока пользователь не решит остановить задачу. Кроме того, someFloatVar каждый раз отличается.

Я знаю, что могу сделать totalFloat += someFloatVar, но у меня сложилось впечатление, что это то же самое, что и в отношении эффективности. То, что я ищу, это то, что не уменьшит общую скорость и производительность приложения.

Если нет, то это лучший способ сложить два числа (которые могут быть потенциально довольно большими?)

В этом контексте я постоянно обновляю пробег. Следовательно, это может быть 5,678 или 895,67 метра или более.

Ответы [ 6 ]

1 голос
/ 17 января 2012

Должен быть более эффективный способ, верно?

Нет, не существует более эффективного способа добавить число в переменную.На самом деле, это, вероятно, 2 или 3 машинных инструкции ... всего несколько наносекунд.

Однако ...

Эти числа непрерывно складываются, пока пользователь не решит остановитьtask.

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

1 голос
/ 17 января 2012

Короткий ответ: да, это самый эффективный способ сложения двух чисел с плавающей запятой. Длинный ответ да, но это не должно быть проблемой. Это представляет собой одну инструкцию в машинном коде, поэтому нет другого способа сделать это быстрее. Я считаю, что большинство процессоров Android имеют FPU, что означает, что он действительно очень быстрый. Технически вы могли бы выполнять некоторую математику с фиксированной запятой, но процессоры, даже на мобильных устройствах, настолько смехотворно быстро справляются с трудностями, что использование математики с фиксированной запятой - это путь, превосходящий инженерные.

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

В конце вы должны написать код, так как это наиболее разумно, измерить, насколько быстро он работает, если этого недостаточно, затем использовать профилировщик, чтобы определить, где код тратит больше всего времени, и исправить эту область с помощью лучший алгоритм, кеширование, менее частые вызовы и т. д. Вспомните старую поговорку «Сделай так, сделай это правильно, сделай это быстро. И повтори».

1 голос
/ 17 января 2012

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

1 голос
/ 17 января 2012

Вы можете удалить один из totalFloat, используя следующий синтаксис:

totalFloat += someFloatVar;

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

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

0 голосов
/ 17 января 2012

Я не совсем уверен, что вы спрашиваете.

Я предполагаю, что у вас есть что-то вроде этого:

float someFloatVar = 0.5;
float totalFloat = 0.0;
while(true){
    totalFloat += someFloatVar;
}

Учитывая, что someFloatVar является статическим и НЕ ИЗМЕНЯЕТСЯ каждый раз, когда вы добавляете его, вы МОЖЕТЕ сделать это таким образом (хотя экономия эффективности на самом деле незначительна). Запишите временную метку, которую вы НАЧИНАЕТЕ для задачи, и когда задача будет остановлена, минус та временная метка от текущей временной метки. Определите скорость добавления (возможно, 100 в секунду или аналогичную), а затем умножьте someFloatVar на rateOfAddition*timeDiffSecs и добавьте ее к исходному значению (totalFloat).

0 голосов
/ 17 января 2012

У вас все хорошо, хотя вместо этого можно написать totalFloat += someFloatVar.

Единственный раз, когда я буду беспокоиться о такой ситуации, это использование строки.Строки - это единственный раз, когда вы, вероятно, не хотите непрерывно добавлять данные (но использование StringBuilder и его метода .append() будет эффективным, но эта часть не относится к теме:)).

В качестве альтернативы,дайте пользователю шапку!Как только число станет слишком большим для вашего вкуса, остановите процесс самостоятельно.Другая возможность - НЕ использовать что-то с синтаксисом типа while(true).Обновляйте номер только время от времени.

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