¿Mejorar rendimiento? -> Dos dudas.
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.
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.