Этот метод быстрее, чем Math.random ()? - PullRequest
4 голосов
/ 13 марта 2011

Я новичок и в настоящее время начал работать над игрой для Android, которая использует алгоритм оптимизации роя частиц. Сейчас я пытаюсь немного оптимизировать свой код, и у меня довольно много Math.random () в for-loop, который работает почти все время. Поэтому я думал о способе обойти и пропустить все вызовы Math.random ().

Используя такой метод:

    float random[] = new float[100];
static int randomIndex=0;

private float myRandom(){
    if(randomIndex >= 99)
        randomIndex = 0;
    else
        randomIndex = randomIndex+1;
    return random[randomIndex];
}

... а также делайте это один раз, когда начинается действие:

for (int i=0; i< 100; i++)
        random[i]=(float) Math.random();

Мой вопрос: будет ли это лучше (быстрее), чем использование Math.random ()? У кого-нибудь есть лучшее предложение, как это сделать?

Мне также интересно, если кто-нибудь знает какой-нибудь хороший сайт, где я могу прочитать больше о том, как написать эффективный код Java / Android. Боюсь, мне это не по вкусу.

Ответы [ 3 ]

7 голосов
/ 14 марта 2011

Научитесь доверять Java API: это мощно и быстро. «Преждевременная оптимизация - корень всего зла». Сделайте так, чтобы ваша программа работала, прежде чем вы начнете беспокоиться о таких вещах.

Для вашей цели, однако, вам может быть удобнее сравнить ваш метод с Java в цикле, скажем, 30 миллионов, а затем сравнить время.

Не говоря уже о заполнении массива из 100 случайных чисел, тогда его использование миллион раз вовсе не случайно.

3 голосов
/ 14 марта 2011

Это, безусловно, будет быстрее, но не будет «лучше» в том смысле, что не будет генерировать очень хорошие случайные числа. Может быть, это нормально для вашей игры; возможно это не так.

Существует несколько реализаций java.util.Random, которые могут быть быстрыми. Вы можете проверить библиотеку Uncommons Maths , но обязательно найдутся и другие. У Uncommons есть «XORShiftRNG», который разработан, чтобы быть быстрым.

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

1 голос
/ 14 марта 2011

Вот статья об оптимизации http://www.javaworld.com/javaworld/jw-04-1997/jw-04-optimize.html?page=1

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

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

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

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

...