В управляемом коде, как я достигаю хорошей местности ссылки?

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

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

Обычно UI зависит от бизнес-логики для вещей как проверка. Помещение этих вещей в базе данных вызовет плотное соединение между базой данных, и UI или в различных случаях копирует логику проверки между теми двумя.

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

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

Это не означает, что Вы не можете использовать сохраненный procs и представления. Я думаю, что это иногда - хорошая идея поместить дополнительный слой хранимых процедур и представлений между таблицами и приложением (приложениями) для разъединения двух. Тем путем можно изменить расположение базы данных, не изменяя внешний интерфейс, разрешающий Вам осуществлять рефакторинг базу данных независимо.

11
задан Hanno Fietz 5 October 2009 в 08:58
поделиться

6 ответов

  • В .NET элементы массива обязательно являются смежными. В Java я ожидал, что они будут в большинстве реализаций, но, похоже, это не гарантируется.
  • Я думаю, что разумно предположить , что память, используемая экземпляром для полей, находится в одном блоке ... но не забывайте, что некоторые из этих полей могут быть ссылками на другие объекты.

Что касается части массива Java, документация Sun JNI включает этот комментарий, спрятанный в обсуждении строк:

Например, виртуальная машина Java может не хранить массивы непрерывно.

Что касается вашего последнего вопроса, если у вас есть два int [] , то каждый из этих массивов будет непрерывным блоком памяти, но они могли быть очень "далекими" в памяти. Если у вас есть массив объектов с двумя полями int, тогда каждый объект может быть далеко друг от друга, но два целых числа в каждом объекте будут близко друг к другу. Что еще более важно, вы в конечном итоге займете на много больше памяти с решением «много объектов» из-за накладных расходов на каждый объект. В .NET вы могли бы вместо этого использовать пользовательскую структуру struct с двумя целыми числами и иметь их массив, чтобы хранить все данные в одном большом блоке.

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

A B C D E

сжимается до

A D E B

(где собирается C) - внезапно A и B, которые, возможно, были "

9
ответ дан 3 December 2019 в 08:05
поделиться

Во-первых, ваш заголовок подразумевает C #. «Управляемый код» - это термин, придуманный Microsoft, если я не ошибаюсь.

Примитивные массивы Java гарантированно представляют собой непрерывный блок памяти. Если у вас есть

int[] array = new int[4];

, вы можете из JNI (собственный C) получить int * p , чтобы указать на фактический массив. Я думаю, это относится и к классу контейнеров Array * (ArrayList, ArrayBlockingQueue и т. Д.).

Я думаю, что ранние реализации JVM имели объекты как непрерывную структуру, но этого нельзя предполагать с новыми JVM. (JNI абстрагирует это.)

Два целых числа в одном объекте, как вы говорите, вероятно, будут «ближе», но могут и не быть. Это, вероятно, будет отличаться даже при использовании одной и той же JVM.

Объект с двумя полями int является объектом, а я не Не думаю, что любая JVM дает какие-либо гарантии, что участники будут «закрыты». Скорее всего, массив int с двумя элементами будет поддерживаться массивом длиной 8 байт.

3
ответ дан 3 December 2019 в 08:05
поделиться

Что касается массивов, вот выдержка из спецификации CLI (Common Language Infrastructure):

Элементы массива должны быть расположены внутри объекта массива в строчном значении порядок (т. е. элементы, связанные с крайним правым размером массива должны располагаться непрерывно от самого низкого до самого высокого индекса ). В фактическое хранилище, выделенное для каждого элемент массива может включать обивка для конкретной платформы. (Размер этого хранилища в байтах возвращается по размеру инструкции, когда это применяется к типу этого массива элементы.

2
ответ дан 3 December 2019 в 08:05
поделиться

Хороший вопрос! Думаю, я бы прибег к написанию расширений на C ++, которые обрабатывают память более тщательно управляемым образом и просто предоставляют достаточно интерфейса, чтобы остальная часть приложения могла манипулировать объектами. Если бы меня так беспокоила производительность, я бы, вероятно, все равно прибегнул к расширению C ++.

2
ответ дан 3 December 2019 в 08:05
поделиться

Я не думаю, что кто-то говорил о Python, поэтому попробую

Могу ли я ожидать, что массив будет соседним блоком памяти (да) ?

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

Два целых числа в одном экземпляре ближе, чем два в разных экземплярах тот же класс (вероятно)?

Вероятно, не по той же причине, что и выше. Экземпляр будет содержать только указатели на объекты, которые являются действительными целыми числами. Python не имеет собственного int (например, Java), только Int (на языке Java) в коробке.

Занимает ли объект непрерывную область памяти (нет)?

Вероятно, нет. Однако если вы используете оптимизацию __ slots __ , то некоторые ее части будут смежными!

What ' (этот пример, вероятно, специфичен для Java)

В Python с точки зрения локализации памяти они почти одинаковы! Один будет создавать массив указателей на объекты, который, в свою очередь, будет содержать два указателя на целые числа, другой - два массива указателей на целые числа.

2
ответ дан 3 December 2019 в 08:05
поделиться

Если вам нужно оптимизировать до этого уровня, я подозреваю, что язык на основе виртуальной машины не для вас;)

-3
ответ дан 3 December 2019 в 08:05
поделиться