I fue el benchmarking algunos algoritmos STL, y yo estaba sorprendido por el tiempo empleado por el código siguiente: (Medí el código g ++ compilado [sin optimizaciones] con el comando time
)¿Por qué el vector (tamaño) es más lento que el nuevo []?
#include <vector>
struct vec2{
int x, y;
vec2():x(0), y(0) {}
};
int main(int argc, char* argv[]){
const int size = 200000000;
std::vector<vec2> tab(size); //2.26s
// vec2* tab = new vec2[size]; //1.29s
// tab[0].x = 0;
// delete[] tab;
return 0;
}
El tiempo empleado por una la inicialización del vector es 2.26s mientras que new
(y delete
) toma 1.29s. ¿Qué está haciendo el vector ctor que tomaría mucho más tiempo? new[]
llama al constructor en cada elemento, al igual que el ctor vector
, ¿verdad?
entonces compilado con -O3, que fue todo más rápido, pero todavía había una brecha entre los dos códigos. (Obtuve respectivamente 0,83 sy 0,75)
¿Alguna idea?
Además de lo dicho DeadMG, no tiene sentido hacer referencia "One Shot" (y, como se vio, sin puntos de referencia optimizaciones), porque hay fluctuaciones estadísticas debido a fallos de caché & co. Debe repetir el índice de referencia una cantidad significativa de veces (en el mismo proceso), medir el tiempo de cada prueba y calcular la media y la desviación estándar. Solo después de obtener estos datos puede hacer una comparación sensata: si las dos veces difieren de la incertidumbre de su medida (calculada combinando las dos desviaciones estándar en RSS), no hay una diferencia significativa. –
Tenga en cuenta que, dado que su código solo hace referencia a 'tab [0]', es perfectamente legal que el compilador asigne solo ese elemento. De hecho, como solo escribes en 'tab [0]' y nunca lees el valor, y no es 'volátil', es perfectamente legal que el compilador elimine completamente el cuerpo de' main() 'en el resultado, ya que no tiene efectos secundarios observables. –
Probé esta prueba en Visual Studio, obtuve los resultados opuestos (el mejor tiempo para el vector fue un 10% mejor), pero el ruido de medición (~ 20-25%) fue mayor que la diferencia. Entonces estas medidas son realmente discutibles cuando se trata de aplicaciones de la vida real. –