При написании Java-программы я могу повлиять на то, как процессор будет использовать свой кеш для хранения моих данных? Например, если у меня есть массив, к которому обращается много, помогает ли он, если он достаточно мал, чтобы вписаться в одну строку кэша (обычно 128 байт на 64-битной машине)? Что делать, если я сохраняю много используемого объекта в пределах этого предела, могу ли я ожидать, что память, используемая им, будет близка и останется в кеше?
Фон: я создаю сжатое цифровое дерево, которое сильно вдохновлено массивы Judy, которые находятся на C. В то время как в основном я использую методы сжатия node, у Джуди есть оптимизация кэша ЦП в качестве центральной цели дизайна и типов node, а также эвристика для переключение между ними в значительной степени зависит от этого. Мне было интересно, есть ли у меня шанс получить эти преимущества?
Изменить. Общий совет ответов до сих пор заключается в том, чтобы не пытаться микрооптимизировать детали машинного уровня, когда вы так далеко от машины, как на Java. Я полностью согласен, поэтому я чувствовал, что должен добавить некоторые (надеюсь) разъясняющие комментарии, чтобы лучше объяснить, почему я думаю, что этот вопрос по-прежнему имеет смысл. Они приведены ниже:
Есть несколько вещей, которые обычно проще обрабатывать компьютеры из-за того, как они создаются. Я видел, что Java-код работает значительно быстрее при сжатии данных (из памяти), хотя декомпрессии пришлось использовать дополнительные циклы ЦП. Если данные были сохранены на диске, очевидно, почему это так, но, конечно, в ОЗУ этот же принцип.
Теперь, у компьютерной науки есть много возможностей сказать о том, что это такое, например, локальность ссылок отлично подходит для C, и я предполагаю, что это все еще замечательно в Java, возможно, даже более того, если это помогает оптимизировать время выполнения, чтобы сделать больше умные вещи. Но как вы это делаете, может быть, совсем другое. В C я могу написать код, который управляет большими кусками памяти и использует смежные указатели для связанных данных.
В Java я не могу (и не хочу) много знать о том, как память будет управляться определенной средой выполнения. Поэтому я должен принимать оптимизацию и на более высокий уровень абстракции. Мой вопрос в основном, как мне это сделать? Что касается локальности ссылки, то что означает "близко друг к другу" на уровне абстракции, над которой я работаю на Java? Тот же объект? Тот же тип? Тот же массив?
В общем, я не думаю, что слои абстракции меняют "законы физики", метафорически. Удвоение вашего массива в размере каждый раз, когда вы заканчиваете пространство, является хорошей стратегией на Java, даже если вы больше не называете malloc()
.