10

Вопрос по java, optimization, python, memory-management, c# – В управляемом коде, как мне добиться хорошего месторасположения ссылки?

Так как ОЗУ кажетсяновый диск [http://www.infoq.com/news/2008/06/ram-is-disk]и поскольку это утверждение также означает, что доступ к памяти теперь считается медленным, подобно тому, как доступ к диску всегда был, я хочу максимизировать местность ...

<span>d переключать структуры данных на основе результатов реальных тестов. Не то, выделяет ли он свою память в сплошной ком или нет.</span>

от wefwfwefwe

<span>Дело в том, что выскорее всего, вы окажете плохую услугу, пытаясь перехитрить разработчиков .net / java в том, что они должны были сделать для вас.</span>

от wefwfwefwe

<span>@wefwfwefwe: а ваша точка зрения - что именно? Даже если ответы на ХанноВопросы не гарантируются никаким стандартом, вы должны использовать<i>что-то</i> оптимизировать, если вам действительно нужна оптимизация.</span>

от hjhill

<span>Кроме того, кеш это новый CD-ROM ... и вытеперь полагаемся на внутренние детали реализации для вашей производительности. Один пакет обновления для .NET, который меняет работу за кулисами, и весь ваш стек падает ...</span>

от wefwfwefwe

<span>@wefwfwefwe: яЯ не пытаюсь кого-то перехитрить, яя пытаюсь понять уровни абстракции яЯ работаю с тем, чтобы оптимально использовать их. Когда я&#39;м, используя<code>Map</code> Реализация в Java, я принимаю во внимание, использует ли он хеш-таблицу и хочу ли я этого. Если я могу переключать структуры данных и получать более высокую вероятность непрерывной памяти, я сделаю это одним из моих вариантов. Не больше, но, конечно, не меньше.</span>

от Hanno Fietz

6 ответов

2

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

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

-3

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

2

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

3

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

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

int[] array = new int[4];

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

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

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

Объект с двумя полями int является объектом, и я неЯ думаю, что любая JVM не дает никаких гарантий, что члены будут "близко", Весьма вероятно, что массив int с двумя элементами будет поддерживаться массивом длиной 8 байт.

9

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

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

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

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

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

A B C D E

уплотняется до

A D E B

(где собрано С) - вдруг А и В, которые могли бытьблизко" раньше, далеко друг от друга. Я неЯ не знаю, происходит ли это на самом деле в каком-либо сборщике мусора (вокруг много народу!), но это 'возможно.

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

2

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

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

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

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

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

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

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

Какие'Разница между массивом объектов только с двумя полями int и одним объектом с двумя полями int []? (этот пример, вероятно, специфичен для Java)

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

Похожие вопросы