Esto es probablemente demasiado genérico para tener una respuesta clara. Los enfoques en C o C++ en comparación con Java diferirán bastante (la forma en que el lenguaje establece los objetos difiere).
Lo básico sería, mantener los datos a los que se accederá en bucles cerrados juntos. Si su bucle opera en tipo T, y tiene miembros m1 ... mN, pero solo m1 ... m4 se usan en la ruta crítica, considere dividir T en T1 que contiene m1 ... m4 y T2 que contiene m4. ..Minnesota. Es posible que desee agregar a T1 un puntero que haga referencia a T2. Intente evitar los objetos que no están alineados con respecto a los límites de caché (depende de la plataforma).
Use contenedores contiguos (matriz antigua simple en C, vector en C++) e intente administrar las iteraciones para que suban o bajen, pero no salten aleatoriamente por todo el contenedor. Las listas son asesinas para la localidad, dos nodos consecutivos en una lista pueden estar en ubicaciones aleatorias completamente diferentes.
Los contenedores de objetos (y los genéricos) en Java también son un asesino, mientras que en un Vector las referencias son contiguas, los objetos reales no (hay un nivel extra de indirección). En Java hay muchas variables adicionales (si new
dos objetos uno después del otro, los objetos probablemente terminen en ubicaciones de memoria casi contiguas, aunque habrá algo de información adicional (generalmente dos o tres punteros) de Datos de administración de objetos en el medio. GC moverá objetos, pero con suerte no empeorará las cosas de lo que era antes de ejecutarse.
Si se está enfocando en Java, cree estructuras de datos compactas, si tiene un objeto que tiene una posición, y que se debe acceder en un ciclo cerrado, considere mantener un tipo primitivo x
y y
dentro de su objeto en lugar de crear un Point
y mantener una referencia. Los tipos de referencia deben actualizarse, y eso significa una diferente asignación, una indirección adicional y menos localidad.
Ver este lenguaje cuestión independiente [¿Cómo se puede escribir código que mejor utiliza la memoria caché de la CPU para mejorar el rendimiento] (http://stackoverflow.com/questions/763262/how-does-one-write-code-that-best-utilizes-the-cpu-cache-to-improve-performance) –
Puede abordarlo desde dos lados: mezclar los datos en la memoria es un enfoque, mezclar el procesamiento en el tiempo es otro. – MSalters
@MSalters, pero poner 0.5MB de datos en RAM no garantiza que esté todo en la caché al mismo tiempo? – mezamorphic