Multithreading nicht schneller als einzigen thread (simple-loop-test)

Ich experimentiere mit einigen multithreading-Konstruktionen, aber irgendwie scheint es, dass multithreading nicht schneller als ein einzelner thread. Ich verengt Sie sich auf einen sehr einfachen test mit einer verschachtelten Schleife (1000x1000), in dem das system zählt nur.

Unten habe ich gepostet der code für single-threading und Multi-Threading und wie Sie ausgeführt werden.

Das Ergebnis ist, dass die single-thread schließt die Schleife in etwa 110 ms, während die beiden threads auch über 112 ms.

Ich glaube nicht, dass das problem ist der overhead von multithreading. Wenn ich nur die Einreichung eines von beiden Runnables an den ThreadPoolExecutor, es führt in der Hälfte der Zeit der einzige thread, der Sinn macht. Aber hinzufügen, dass der zweite Thread macht es 10 mal langsamer. Beide 3.00 Ghz Kerne laufen auf 100%.

Ich denke, es kann pc-spezifisch, als jemand anderes die pc zeigte, double-speed-Ergebnisse auf dem multithreading. Aber dann, was kann ich dagegen tun? Ich habe einen Intel Pentium 4 3.00 GHz (2 CPUs) und Java jre6.

Test-code:

//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 ausgeführt wird, in etwa 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

Dieser code ausgeführt wird, in etwa 112 ms.

Edit: ich habe die Runnables zu Threads und entledigte sich der ExecutorService (für die Einfachheit des Problems).

Edit: habe versucht einige Vorschläge

  • Also, haben Sie versucht, die Vorschläge?
  • Ah, Pentium4 - siehe meine aktualisierte Antwort 🙂
InformationsquelleAutor RemiX | 2010-09-29
Schreibe einen Kommentar