Estoy probando un algoritmo para bin 2d y he elegido PHP para simularlo, ya que es mi lenguaje pan y mantequilla en la actualidad.PHP array performance
Como puedes ver en http://themworks.com/pack_v0.2/oopack.php?ol=1 funciona bastante bien, pero necesitas esperar alrededor de 10-20 segundos para empacar 100 rectángulos. Para algunos conjuntos difíciles de manejar, alcanzaría el límite de tiempo de ejecución de 30 php.
Hice algunos perfiles y muestra que la mayoría de las veces mi script pasa por diferentes partes de una pequeña matriz 2d con 0 y 1 en ella. Comprueba si cierta celda es igual a 0/1 o la establece en 0/1. Puede hacer tales operaciones millones de veces y cada vez lleva pocos microsegundos.
Supongo que podría usar una matriz de booleanos en un lenguaje estáticamente tipado y las cosas serían más rápidas. O incluso hacer una matriz de valores de 1 bit. Estoy pensando en convertir todo en un lenguaje compilado. ¿PHP no es bueno para eso?
Si necesito convertirlo, digamos C++, ¿qué tan buenos son los convertidores automáticos? Mi script es solo un montón de bucles con matrices básicas y manipulaciones de objetos.
Editar. Esta función se llama más que cualquier otra. Se lee algunas propiedades de un objeto muy simple, y pasa a través de una muy pequeña parte de una matriz más bien pequeña para comprobar si hay algún elemento no es igual a 0.
function fits($bin, $w, $h, $x, $y) {
$w += $x;
$h += $y;
for ($i = $x; $i < $w; $i++) {
for ($j = $y; $j < $h; $j++) {
if ($bin[$i][$j] !== 0) {
return false;
}
}
}
return true;
}
Actualización: He intentado usar el conjunto en lugar de 1d 2d como una de las respuestas sugeridas. Como necesitaba tener siempre disponible el ancho actual de la papelera, decidí ajustar todo en el objeto. Además, ahora en cada bucle, el índice debe calcularse. Ahora el script tarda aún más tiempo en ejecutarse. Otras técnicas no aportaron mucho impulso al rendimiento, sino que hicieron que el código fuera menos legible. Es hora de HipHop, supongo.
Actualización: ya que hiphop php solo se ejecuta en Linux, y no tengo uno, he decidido volver a escribir todo en C++. Es bueno refrescar las viejas habilidades. Además, si encuentro una forma de usar hiphop, será interesante comparar el código de C++ escrito a mano y el que hiphop generaría.
Actualización: reescribí esta cosa en C++, en promedio funciona 20 veces más rápido y usa mucha menos memoria. Déjame ver si puedo hacerlo aún más rápido.
Usted podría haber escrito el código de manera muy ineficiente, pero no podemos saber que a menos que lo vemos. Si bien PHP es generalmente más lento que los lenguajes compilados, eso no significa que sea la lentitud del lenguaje lo que hace que el código demore tanto en ejecutarse –
No escriba nada sensible a este rendimiento en PHP. La mejor apuesta sería escribir en C++ (probar hip-hop). –
Hola DFO, si es posible, ¿podemos ver algún código para la parte que está tomando todo el tiempo? Tal vez alguien pueda sugerir algunas mejoras al algoritmo o una mejor forma de almacenar sus datos. – Leigh