2010-01-04 14 views
5

Tengo una clase de iterador que recorre una gran variedad de objetos y cargas de la base de datos cuando es necesario (cuando no está cargado en la memoria). El problema es que esto se repite unas 200,000 veces y descubrí desde aquí: http://www.garfieldtech.com/blog/magic-benchmarks que la interfaz del iterador es increíblemente lenta.PHP Lazy Load Iterator

¿Alguien sabe de una buena forma de carga lenta sin usar una interfaz de iterador?

+2

Incluso si logras reemplazar tu iterador con algo así como acceso en matriz sin formato, todavía estarás iterando más de 200,000 entradas. Tu método de iteración probablemente no sea tu mayor problema, es el conjunto de datos masivo sobre el que estás iterando. –

+0

En mi situación, cada milisegundo puede hacer una gran diferencia. Cambiar una función is_null simple a === null por ejemplo guardada 2 segundos. – Louis

Respuesta

6

Puede usar un viejo y simple bucle for.

La interfaz del iterador puede ser lenta, pero cuando se realizan 200.000 consultas de DB, es probable que el cuello de botella no sea el iterador. Sugeriría que el perfil de su código para ver si realmente necesita una optimización en esta posición.

Optimizatizion prematura es la raíz de todo mal :)

+0

En realidad, se realizarán aproximadamente 10 consultas. Cada fila contiene datos serializados de alrededor de 100 objetos. He hecho muchos perfiles y este parece el problema a menos que haya problemas con los tiempos de acceso a la matriz. – Louis

+0

Bueno, cambie a arreglos regulares y luego use un bucle for. Sin ver ningún código, esta es la mejor idea que puedo ofrecer. – Gordon

0

mejor solución era utilizar un bucle for y una clase Singleton con los índices y métodos de iteración.

+3

entonces hiciste lo que sugerí pero luego decidiste dar tu propia respuesta para la aceptación? Muy amable. – Gordon

+0

Deberías haber exceptuado la respuesta de Gordon. Si se toma el tiempo y el esfuerzo para responder correctamente a su pregunta, se merece los puntos. Si tenía pequeñas adiciones, debería haberlas dejado como un comentario debajo de su respuesta. – William

+0

Mi mal, no sé por qué no lo acepté. Bueno, parece que no necesitas desesperadamente los puntos: P – Louis