Ich experimentiere mit einigen Multithreading-Konstruktionen, aber irgendwie scheint Multithreading nicht schneller als ein einzelner Thread zu sein. Ich habe es auf einen sehr einfachen Test mit einer verschachtelten Schleife (1000x1000) beschränkt, in der das System nur zählt.
Unten habe ich den Code sowohl für Single Threading und Multithreading und wie sie ausgeführt werden.
Das Ergebnis ist, dass der einzelne Thread die Schleife in ungefähr 110 ms schließt, während die zwei Threads auch ungefähr 112 ms dauern.
Ich glaube nicht, dass das Problem der Overhead des Multithreading ist. Wenn ich nur einen der beiden Runnables an den ThreadPoolExecutor übergebe, wird er in der Hälfte der Zeit des einzelnen Threads ausgeführt, was sinnvoll ist. Aber das Hinzufügen dieses zweiten Runnable macht es 10 mal langsamer. Beide 3,00 GHz-Kerne laufen zu 100%.
Ich denke, dass es PC-spezifisch sein kann, da der PC von jemand anderem Doppelgeschwindigkeitsergebnisse auf dem Multithreading zeigte. Aber was kann ich dagegen tun? Ich habe einen Intel Pentium 4 3.00GHz (2 CPUs) und Java jre6.
Prüfregeln:Multithreading nicht schneller als Single-Thread (einfacher Loop-Test)
// 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
Dieser Code in etwa 110 ms ausgeführt wird.
// 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
Dieser Code wird in etwa112 ms ausgeführt.
Edit: Ich änderte die Runnables zu Threads und löste den ExecutorService (zur Vereinfachung des Problems).
Edit: versucht, einige Vorschläge
Also, hast du die Vorschläge ausprobiert? –
Ah, Pentium4 - siehe meine aktualisierte Antwort :) – snemarch