2012-01-03 13 views
5

Ejecuté un generador de perfiles (muy soñoliento) en mi programa y muestra un alto porcentaje en mi función de reinicio (la función de reinicio se ejecuta por fotograma). Los programas se ve así:vector :: clear() cuesta tanto tiempo?

Sección Init:

std::vector<std::vector<int>> VecOfVecOfPath; 
VecOfVecOfPath.resize(20); 
for(int i=0; i<20; i++) VecOfVecOfPath.reserve(640); 

VecOfVecOfPath es una serie de camino encontrado por otras funciones. VecOfVecOfPath [i] se completará durante la ejecución, por fotograma. P. ej. Es push_back -ed por otras funciones, y restablecer antes de usar, por cuadro.

La función de reinicio:

void Reset() 
{ 
for(int i=0; i<20; i++) VecOfVecOfPath[i].clear(); 
} 

Así que la reposición es muy simple, pero sí tienen un muy alto rango en perfilador.

¿Es esto común? ¿Tiene vectorial :: clear() tener tales gastos generales incluso para los vectores de tipo incorporados?

Gracias!


Intenté construir el programa en modo Release y luego el costo se redujo a casi cero. De 12 ~ 13% a 0.03 ~ 0.04%.

Luego fui al código fuente de y hay definiciones como ITERATOR_DEBUG_LEVEL efectuando operaciones adicionales en el modo de depuración.

Así es como se sugirió @ noggin182, las cosas son diferentes en el modo de depuración y liberación.

Cita: "Meke Seguro que está perfilando en la liberación y acumulación de búsqueda para ver si hay alguna preprocesador condicional define configura para aumentar el rendimiento - noggin182 Ene 3 en el 15:32."

+0

¿Ha considerado que está llamando 'clear' innecesariamente? –

+0

@parapurarajkumar - lo primero que se me ocurrió, también. Creo que necesitamos más detalles sobre el uso de 'VecOfVec'; quizás los Vecs se puedan reciclar para evitar el claro. –

+4

vector del vector de qué? –

Respuesta

1

Depende de lo que es en su vector, si sus vectores anidados contienen clases, invocará el cursor para cada instancia en los vectores anidados. Estoy bastante seguro de que también será una desasignación de memoria.

Parece que estás escribiendo un juego? Si es así, algunos libros (PDF) que he leído sobre escritura de juegos sugieren que el vector es bueno para uso general, pero será mejor que NO lo uses para juegos. Simplemente use arreglos nativos y administre la memoria usted mismo o despliegue su propia clase de contenedor.

¿Es 640 el límite superior de su vector? ¿Sería mejor que tal vez uses algo como esto?

sometype Values[20][640]; 
int size[20]; 

Entonces su llamada de reposición podría ser sólo

for(int i=0; i<20; i++) size[0] = 0; 

Usted todavía incluso ser capaz de utilizar las funciones STL así:

std::sort(Values[i], Values[i] + size[i]); 

Eso es alrededor de tanta ayuda como pueda proporcionar sin más información

+0

es del tipo int, así que pensé que no tomaría mucho tiempo en borrarlo() - in it. ¿Y pensé que los arreglos nativos son los mismos que los vectores si lo reservo correctamente()? Entonces los vectores no harán la reasignación así que es rápido. –

+0

bien, si es un vector int entonces habría pensado que esto no debería ser tan lento. Qué compilador estas usando? No he visto todas las implementaciones de vectores, pero me sorprendió lo diferentes que eran entre MSVC, Borland y GCC. Todos ellos también tienen interruptores para permitir ciertos controles de cordura y depuración y para realizar tareas como el control de rango y el enmascaramiento. Asegúrese de que solo usa iteradores en el contenedor para el que están diseñados. Asegúrate de estar creando perfiles y compilando para ver si hay algún preprocesador condicional que defina para mejorar el rendimiento. – noggin182

+0

Estoy usando el profesional VS2010. Probaré la versión de lanzamiento más tarde esta mañana e informaré el resultado, ¡gracias! –

Cuestiones relacionadas