¿Mejorar rendimiento? -> Dos dudas.

ElecTeC
01 de Diciembre del 2009
Hola a todos, estoy escribiendo un programa (un automata celular) y necesito optimizar el rendimiento al máximo.

He detectado dos trozos de código que necesito optimizar, pero no sé cómo.

Por un lado tengo:

Celula[][] cells = new Celula();

...
while(noparar)
{
for (int i = 0; i < 10000; i++)
{
for(int i = 0; i < 10000; i++)
{
Celula cellnext[i][j] = new Celula();

//Operaciones intermedias;

cell = cellnext;
}
}
}

El problema de esto es la creación de tantas nuevas cellnext, que hace un uso abusivo del GC collector; disminuyendo así el rendimiento. Se me había ocurrido algo como un intercambio de referencias entre cell y cellnext, pero en java no esta permitido; la otra opción era clone() pero es mas lento que crear un nuevo objeto e inicializarlo.

¿Alguna idea para evitar la creación masiva de nuevos objetos?

por el otro lado tengo:

// Durante muchas iteraciones se ejecuta lo siguiente

b = this.getVecinos(x,y-1).substring(implicadas,implicadas*implicadas);

for(int i = 0; i < implicadas; i++)
{
nuevax = this.getRadio() + i
nuevay = y;
b = b.concat(Character.toString(this.getValor()[nuevax][nuevay].getEstado()));

}


Lo cual consume tambien mucho tiempo de ejecución, debido a la concatenación masiva, y sobretodo, a las repetidas llamadas a la función substring(int prin, int fin);

Habia probado a usar un StringBuilder, o StringBuffer en lugar de String, pero la operación substring() de estas dos clases devuelve un String, con la consiguiente creación de un new StringBuffer(cadena); que incurriría en el problema anterior de demasiada creación (para un uso corto) de demasiados objetos.

Bueno, espero que alguién sepa algo al respecto que pueda orientarme.

Saludos desde Sevilla.