Tengo una implementación de una clase X, que tiene dos punteros a dos piezas de información. He escrito una nueva implementación, clase Y, que tiene solo un puntero a una estructura que contiene las dos piezas de información juntas como miembros adyacentes. Los métodos de X e Y generalmente solo necesitan manipular una de las piezas de información, pero proporcionan un método get() que devuelve un puntero a la segunda pieza (en este caso, la clase X simplemente devuelve su puntero a esa pieza y la clase Y devuelve la dirección del segundo miembro de la estructura). En el uso normal, las llamadas a los métodos de X e Y se intercalarán con llamadas a get() y haciendo el trabajo en esa segunda pieza devuelta.C++, formas de comparar las mejoras en la localidad de caché?
Espero que en situaciones de la vida real se produzca una mejora en el rendimiento, ahora que las dos piezas de información están una junto a la otra en la memoria en la implementación de la clase Y (porque son miembros adyacentes de una estructura), pero No veo ninguna diferencia en los puntos de referencia que he escrito (intercalando llamadas a los métodos de X e Y con el trabajo en sus segundas piezas en grandes loops). Sospecho que esto es porque todo encaja en el caché en cualquier caso en mis pruebas. No quiero probar esto en mi aplicación real todavía porque la semántica de X e Y difieren en otras formas sutiles no relacionadas con esta optimización y portar la aplicación que lo usa será un trabajo, y se supone que estos puntos de referencia ayudan a justificarlo. trabajar en primer lugar.
Cuál es la mejor manera de observar la diferencia en el rendimiento debido a una mejor localidad caché? Si hago un montón de trabajo ficticio en una matriz igual al tamaño de la caché entre llamadas ¿es suficiente? ¿O quiero trabajar en una matriz un poco menor que el tamaño de la memoria caché, para que el trabajo en mis instancias de mi clase haga que las cosas entren y salgan de la memoria caché? No estoy seguro de cómo codificar algo que sea robusto contra las optimizaciones del compilador y los diferentes tamaños de caché.
'Por qué' no es realmente el problema aquí - la pregunta es bastante clara para comparar la localidad de caché. No creo que 'por qué' realmente agregue algo a la discusión, y es mejor asumir que José sabe lo que está haciendo. – Justicle
El "por qué" siempre es importante, al menos en mi humilde opinión. "Espero que en situaciones de la vida real se produzca una mejora en el rendimiento", lo que me dice que Joseph está buscando acelerar las cosas. "No quiero probar esto en mi aplicación real todavía", lo que sugiere aún más que su objetivo final es un mejor rendimiento, y está tratando de hacerlo a través de una localidad mejorada, por lo que recomendé otros cursos para mejorar el rendimiento. Sin embargo, @Joseph, si tomé la dirección equivocada aquí, ignóralo. ;-) [Y en ese caso, cachegrind es lo que quieres] –
Estoy escribiendo una clase de puntero inteligente que básicamente no tiene algoritmos. Lo he optimizado con g-prof hasta el punto en que cosas como si una rama existe (un si) o una asignación de enteros espurios pueden determinar si mi clase supera a la implementación anterior. Esta es una de las pocas instancias donde definitivamente se aplican las micro-optimizaciones;) –