Разве эффективнее получить доступ к элементам массива через массив, чем получить их через функцию? - PullRequest
1 голос
/ 14 июля 2010

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

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

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

Ответы [ 4 ]

6 голосов
/ 14 июля 2010

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

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

3 голосов
/ 14 июля 2010

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

3 голосов
/ 14 июля 2010

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

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

2 голосов
/ 14 июля 2010

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

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

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

...