С точки зрения производительности, массив удваивается лучше или хуже, чем пользовательский класс в Java? - PullRequest
3 голосов
/ 14 сентября 2011

Я пишу простую реализацию алгоритма GJK (столкновение выпуклых форм) в Java, и она включает в себя множество простых вычислений на трехмерных векторах.С точки зрения производительности по сравнению с читабельностью, было бы лучше хранить точки как double [3] и иметь целый набор статических методов для их обработки (сложение, вычитание, точка, пересечение, отрицание и т. Д.) Или использование класса с методамисодержится внутри?

Проблема с массивом значений типа double заключается в том, что для простого вычитания (например) требуется несколько циклов, если используются специализированные методы, или код становится очень длинным, если они жестко запрограммированы.in. Объект Point делает код намного более читабельным, но стоит ли это того, что, как я полагаю, не является незначительным снижением производительности?

Ответы [ 5 ]

6 голосов
/ 14 сентября 2011

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

Например, скажем, вы обнаружите, что ваше приложение тратит 10% своего времени на выполнениеобнаружение столкновений, и 50% своего времени делает чтение с диска.Если вы можете использовать кеширование для сокращения чтения с диска вдвое, вы повысите производительность на 25%, что более чем в два раза лучше, чем вы могли бы достичь, полностью исключив время обнаружения коллизий.

Как сказал Дональд Кнут "преждевременная оптимизация - корень всего зла. "

0 голосов
/ 14 сентября 2011

Я думаю,

Point point = new Point(x, y, z);

больше похоже на точку, чем

double[] point = {x, y, z};

Итак, идите на занятие! ​​

0 голосов
/ 14 сентября 2011

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

0 голосов
/ 14 сентября 2011

ИМХО, основополагающим принципом ООП является наличие объектов, определяющих контракт и выполняющих свои обязанности (как правило, одиночные).Таким образом, вы должны определенно идти по пути;это также сделает ваш класс более понятным и понятным.

0 голосов
/ 14 сентября 2011

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

...