Estoy experimentando con algunas construcciones de subprocesos múltiples, pero de alguna manera parece que el multithreading no es más rápido que un solo hilo. Lo reduje a una prueba muy simple con un ciclo anidado (1000x1000) en el que el sistema solo cuenta.
A continuación publiqué el código para el subprocesamiento único y el subprocesamiento múltiple y cómo se ejecutan.
El resultado es que el hilo único completa el ciclo en aproximadamente 110 ms, mientras que los dos hilos también toman aproximadamente 112 ms.
No creo que el problema sea la sobrecarga de multihilo. Si solo envío uno de los Runnables al ThreadPoolExecutor, se ejecutará en la mitad del tiempo del único hilo, lo cual tiene sentido. Pero agregar ese segundo Runnable lo hace 10 veces más lento. Ambos núcleos de 3.00Ghz funcionan al 100%.
Creo que puede ser específico de la PC, ya que la PC de otra persona mostró resultados de doble velocidad en el multihilo. Pero entonces, ¿qué puedo hacer al respecto? Tengo un Intel Pentium 4 3.00GHz (2 CPUs) y Java jre6. código
prueba:Multithreading no más rápido que un solo hilo (prueba simple de bucle)
// Single thread:
long start = System.nanoTime(); // Start timer
final int[] i = new int[1]; // This is to keep the test fair (see below)
int i = 0;
for(int x=0; x<10000; x++)
{
for(int y=0; y<10000; y++)
{
i++; // Just counting...
}
}
int i0[0] = i;
long end = System.nanoTime(); // Stop timer
Este código se ejecuta en aproximadamente 110 ms .
// Two threads:
start = System.nanoTime(); // Start timer
// Two of the same kind of variables to count with as in the single thread.
final int[] i1 = new int [1];
final int[] i2 = new int [1];
// First partial task (0-5000)
Thread t1 = new Thread() {
@Override
public void run()
{
int i = 0;
for(int x=0; x<5000; x++)
for(int y=0; y<10000; y++)
i++;
i1[0] = i;
}
};
// Second partial task (5000-10000)
Thread t2 = new Thread() {
@Override
public void run()
{
int i = 0;
for(int x=5000; x<10000; x++)
for(int y=0; y<10000; y++)
i++;
int i2[0] = i;
}
};
// Start threads
t1.start();
t2.start();
// Wait for completion
try{
t1.join();
t2.join();
}catch(Exception e){
e.printStackTrace();
}
end = System.nanoTime(); // Stop timer
Este código se ejecuta en aproximadamente 112 ms .
Editar: Cambié los Ejecutables a Hilos y eliminé el ExecutorService (por la simplicidad del problema).
Editar: intentó algunas sugerencias
¿Has probado las sugerencias? –
Ah, Pentium4 - ver mi respuesta actualizada :) – snemarch