Что я могу сделать в коде Java для оптимизации кеширования процессора?

Когда я пишу программу на Java, я имею влияние на то, как процессор будет использовать свой кеш для хранения моих данных? Например, если у меня есть массив, к которому часто обращаются, поможет ли он, если он достаточно мал, чтобы поместиться в одну строку кэша (обычно 128 байт на 64-битной машине)? Что если я сохраню часто используемый объект в пределах этого предела, могу ли я ожидать, что память, используемая его членами, будет находиться близко друг к другу и оставаться в кеше?

Фон: я строю сжатыйцифровое деревоЭто сильно вдохновленоДжуди Массив, которые находятся в C. Хотя я в основном использую методы сжатия узлов, у Джуди центральная цель проектирования - оптимизация кэша ЦП, и типы узлов, а также эвристика переключения между ними находятся под сильным влиянием. Мне было интересно, есть ли у меня шанс получить эти преимущества тоже?

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

Есть некоторые вещи, которые обычно проще для компьютеров из-за способа, которым они построены. Я видел Java-код, работающий заметно быстрее на сжатых данных (из памяти), даже несмотря на то, что для распаковки пришлось использовать дополнительные циклы ЦП. Если данные были сохранены на диске, очевидно, почему это так, но, конечно, в ОЗУ это тот же принцип.

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

В Java я не могу (и не хочу) много знать о том, как память будет управляться конкретной средой выполнения. Так что я тоже должен перенести оптимизацию на более высокий уровень абстракции. Мой вопрос в основном, как мне это сделать? Что касается ссылки, что означает «близко друг к другу» на уровне абстракции, над которым я работаю в Java? Тот же объект? Того же типа? Тот же массив?

Вообще, я не думаю, что уровни абстракции изменяют «законы физики», образно говоря. Удвоение размера вашего массива каждый раз, когда у вас заканчивается пространство, также является хорошей стратегией в Java, даже если вы не вызываетеmalloc() больше.

Ответы на вопрос(5)

Ваш ответ на вопрос