Я пишу библиотеку где:
- Ему нужно будет работать на различных платформах/Java (общий случай, скорее всего, будет OpenJDK или Oracle Java на 64-битных машинах Intel с Windows или Linux)
- Достижение высокой производительности - это приоритет, в той степени, в которой меня волнует эффективность линии кэша ЦП в доступе к объекту.
- В некоторых областях пройдены/обработаны довольно большие большие графики небольших объектов (скажем, около 1 ГБ шкалы)
- Основная рабочая нагрузка почти исключительно читается
- Чтения будут разбросаны по графу объектов, но не полностью случайным образом (т.е. будут значимые горячие точки, причем случайные чтения будут отображаться в менее часто посещаемых областях).
- График объектов будет доступен одновременно (но не изменен) несколькими потоками. Нет блокировки, исходя из предположения, что одновременная модификация не произойдет.
Существуют ли какие-либо правила большого пальца/рекомендации для проектирования небольших объектов, чтобы они эффективно использовали линии кэша ЦП в этой среде?
Мне особенно интересны правильная калибровка и структурирование объектов, так что, например, наиболее часто используемые поля вписываются в первую строку кэша и т.д.
Примечание.. Я полностью осознаю, что это зависит от реализации, что мне нужно будет сравнивать, а также от общих рисков преждевременной оптимизации. Не нужно тратить лишнюю полосу пропускания, указывая на это.: -)