переменные против длинных алгоритмов - PullRequest
0 голосов
/ 11 октября 2011

Каковы различия между использованием этих двух алгоритмов.Я всегда задавался вопросом, как я должен оптимизировать вещи. Как они отличаются памятью и скоростью?Один лучше другого?Помимо ясности кода я имею в виду.

это моя первая версия:

bool Intersects(BoundingSphere boundingSphere)
{
    D3DXVECTOR3 vectorBetween = (centre - boundingSphere.centre);

    // works out the distance between the sphere centre's using pythag
    float distance = sqrt(
                         pow(vectorBetween.x, 2) 
                       + pow(vectorBetween.y, 2) 
                       + pow(vectorBetween.z, 2));

    // if two radius's add to more than the distance between the centres
    return (radius + boundingSphere.radius > distance);
}

Этот метод тот же, но он не содержит значений в переменных, он просто использует один длинный расчет

bool Intersects(BoundingSphere boundingSphere)
{
    return (radius + boundingSphere.radius >
            (sqrt(pow((centre - boundingSphere.centre).x, 2) +
                  pow((centre - boundingSphere.centre).y, 2) +
                  pow((centre - boundingSphere.centre).z, 2))));
}

Ответы [ 4 ]

5 голосов
/ 11 октября 2011

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

Правильный способ оптимизации этого кода - не избавиться от переменных (компилятор может сделать это за вас), а избавиться от операции sqrt: просто сравните квадратные расстояния.

1 голос
/ 11 октября 2011

Какой из них легче поддерживать?

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

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

0 голосов
/ 11 октября 2011

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

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

0 голосов
/ 11 октября 2011

Делай, что тебе больше нравится. Если есть проблемы с производительностью, попробуй другой. Без более точной информации о типе D3DXVECTOR3 и возвращаемое значение operator-, которое вы используете, и любое количество других факторов, невозможно даже догадываться о что быстрее. И пока вы не знаете, что этот код является критическим, он на самом деле не имеет значения.

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