2010-07-13 2 views
1

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

Если я хочу перебирать элементы в этом массиве вне объекта, наиболее читаемым и конфиденциальным способом доступа к каждому элементу сетки будет использование функции типа grid.getElement (x, y), которая просто возвращает массив [x] [y].

Когда программа скомпилирована в байт-код, это менее эффективно, чем прямой доступ к массиву с помощью grid.array [x] [y]?

ответ

6

Это потенциально менее эффективно, но это зависит от вашего JVM. Хорошая JIT может встроить функцию, тем самым делая код в точности эквивалентным.

Единственный способ узнать наверняка - сравнить с JVM, который вы будете использовать. Прежде чем вы это сделаете, вы должны убедиться, что это имеет значение. (т. е. профиль , затем optimize) Если ваше профилирование не говорит вам о том, что конкретный фрагмент кода является узким местом, идите с самым чистым дизайном и не пытайтесь микро-оптимизировать, как это. Есть хороший шанс, что в любом случае вы не получите никакой измеримой производительности, и это определенно сделает ваш код более сложным для поддержания.

2

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

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

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

3

Возможно, это немного менее эффективно, но вы должны позволить компилятору и компилятору JIT сделать оптимизацию для вас.

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

3

Относительно соображений производительности механизм доступа через функцию, безусловно, «чище» и «безопаснее». Во-первых, вы можете выставить элементы массива только для чтения, если вы не предоставляете модифицирующую функцию. Не предоставляя ссылку на массив, вы также предотвращаете другие и, возможно, нежелательные обращения к массиву; и, наконец, не подвергая массив массиву, вы сохраняете свой API гибким в отношении будущих модификаций, т. е. заменяя массив другой структурой данных. Это все преимущества в отношении качества вашего кода, и в большинстве случаев они будут весить больше, чем небольшая потеря производительности, связанная с переносом доступа к функции.

Смежные вопросы