Estoy tratando de exprimir hasta el último detalle en mi aplicación Delphi y ahora llegué a un procedimiento que funciona con matrices dinámicas. La línea más lenta esForma más rápida de inicializar matrices en Delphi
SetLength (Resultado, Len);
que se utiliza para inicializar la matriz dinámica. Cuando miro el código para el procedimiento SetLength, veo que está lejos de ser óptimo. La secuencia de llamada es el siguiente:
_DynArraySetLength -> DynArraySetLength
DynArraySetLength consigue la longitud de la matriz (que es cero para inicialización) y luego utiliza ReallocMem que también es innecesario para initilization.
Estaba haciendo SetLength para inicializar la matriz dinámica todo el tiempo. Tal vez me estoy perdiendo algo? ¿Hay una manera más rápida de hacer esto?
EDIT: Describir el algoritmo principal tomaría mucho espacio y realmente es innecesario porque estoy tratando de optimizar una pequeña parte de él. En términos generales, es un verificador del problema de enrutamiento de vehículos (http://en.wikipedia.org/wiki/Vehicle_routing_problem). Necesito tropecientos de asignaciones, porque tengo que mantener todos los datos y mantenerlos por separado. Probalby ayudaría si pudiera pensar en alguna estructura de datos inteligente aquí, pero cualquier cosa que pueda pensar aumentaría en gran medida la complejidad del código. Básicamente he hecho todo lo que pude en el nivel algorítmico, así que ahora estoy tratando de obtener todo lo que pueda de las cosas de bajo nivel. Entonces, esta es una pregunta bastante limitada: ¿hay alguna posibilidad de aumentar esta llamada en particular? Y creo que para hacer esto necesito escribir mi propia función de inicialización basada en el código SetLength. Y hazlo en línea.
'SetLength()' se utiliza para inicializar y establecer la longitud de la matriz. Por lo tanto, no veo cómo optimizarlo, dividiendo las dos funciones. ¿Es realmente un problema? Deberías ejecutarlo solo durante la inicialización ¿no? ¿O lo has ejecutado muchas veces, en un bucle? – TridenT
Una matriz de longitud cero está representada por un puntero nulo, FWIW - en realidad la asignación de nil a una ubicación de matriz dinámica es equivalente a SetLength (arr, 0). Si 'SetLength' es demasiado lento, probablemente lo estés llamando con demasiada frecuencia; Llámalo una vez para establecer un tamaño lo suficientemente grande como para el tamaño más grande, luego haz un seguimiento de la longitud de forma independiente, como dice Andreas en su respuesta. –
¿Tiene una llamada a una función que hace un trillón de veces SetLength (Resultado, Len), o un trillón de llamadas a una función que hace una sola vez SetLength (Resultado, Len)? En el primer caso, revise la respuesta de Andreas a continuación. En el segundo caso, va a ser más complicado. – LeGEC