Estoy tratando de comparar el rendimiento entre punteros sin formato, impulsar shared_ptr y boost weak_ptr. En la parte de desreferenciación, esperaba que shared_ptr y raw_ptr fueran iguales, pero los resultados muestran que shared_ptr es aproximadamente dos veces más lento. Para la prueba, estoy creando una matriz con cualquiera de punteros o punteros compartidos a enteros, y luego eliminación de referencias en un bucle como este:Boost shared_ptr desreferencia costo
int result;
for(int i = 0; i != 100; ++i)
{
for(int i = 0; i != SIZE; ++i)
result += *array[i];
}
El código completo para la prueba se puede encontrar aquí: https://github.com/coolfluid/coolfluid3/blob/master/test/common/utest-ptr-benchmark.cpp
tiempos de prueba para una construcción optimizada sin afirmaciones se pueden encontrar aquí: http://coolfluidsrv.vki.ac.be/cdash/testDetails.php?test=145592&build=7777
Los valores de interés son "tiempo DerefShared" y "tiempo DerefRaw"
Supongo que la prueba puede ser defectuosa de alguna manera, pero no pude deducir de dónde viene la diferencia. La creación de perfiles muestra que el operador * de shared_ptr se incluye, parece que lleva más tiempo. Comprobé dos veces que la aserción de impulso está desactivada.
Estaría muy agradecido si alguien puede explicar de dónde podría venir la diferencia.
independiente adicional de prueba: https://gist.github.com/1335014
+1, yo estaba pensando en esto el otro día también. –
¿Efectos de caché? shared_ptr es más grande que un puntero sin formato, por lo que su matriz cubrirá más líneas de caché y tardará más en leerse. –
¿En qué plataforma está ejecutando estas pruebas? – SoapBox