Servicezeiten direkt proportional zur Anzahl der Threads
Mein System ist i5-Dual Core mit Hyper-Threading. Windows zeigt mir 4 Prozessoren. Wenn ich eine einzelne optimierte CPU-gebundene Aufgabe durch einen einzelnen Thread auf einmal laufen lasse, zeigt seine Servicezeit immer ungefähr 35ms an. Aber wenn ich 2 Aufgaben an 2 Threads gleichzeitig übergebe, werden deren Servicezeiten um die 70ms angezeigt. Ich möchte fragen, ob mein System 4 Prozessoren hat. Warum liegen die Servicezeiten dann bei etwa 70, wenn 2 Threads ihre Tasks ausführen, während 2 Threads auf 2 Prozessoren ohne zeitlichen Aufwand ausgeführt werden sollten. Die Codes lauten wie folgt:
CPU-gebundene Aufgabe lautet wie folgt.
import java.math.BigInteger;
public class CpuBoundJob implements Runnable {
public void run() {
BigInteger factValue = BigInteger.ONE;
long t1=System.nanoTime();
for ( int i = 2; i <= 2000; i++){
factValue = factValue.multiply(BigInteger.valueOf(i));
}
long t2=System.nanoTime();
System.out.println("Service Time(ms)="+((double)(t2-t1)/1000000));
}
}
Thread, der eine Aufgabe ausführt, lautet wie folgt:
public class TaskRunner extends Thread {
CpuBoundJob job=new CpuBoundJob();
public void run(){
job.run();
}
}
nd schließlich ist die Hauptklasse wie folg
public class Test2 {
int numberOfThreads=100;//warmup code for JIT
public Test2(){
for(int i=1;i<=numberOfThreads;i++){//warmup code for JIT
TaskRunner t=new TaskRunner();
t.start();
}
try{
Thread.sleep(5000);// wait a little bit
}catch(Exception e){}
System.out.println("Warmed up completed! now start benchmarking");
System.out.println("First run single thread at a time");
try{//wait for the thread to complete
Thread.sleep(5000);
}catch(Exception e){}
//run only one thread at a time
TaskRunner t1=new TaskRunner();
t1.start();
try{//wait for the thread to complete
Thread.sleep(5000);
}catch(Exception e){}
//Now run 2 threads simultanously at a time
System.out.println("Now run 3 thread at a time");
for(int i=1;i<=3;i++){//run 2 thread at a time
TaskRunner t2=new TaskRunner();
t2.start();
}
}
public static void main(String[] args) {
new Test2();
}
Endausgabe:
ufgewärmt abgeschlossen! Starten Sie jetzt das Benchmarking. Führen Sie zuerst einen einzelnen Thread gleichzeitig aus. Service Time (ms) = 5.829112 Führen Sie jetzt 2 Threads gleichzeitig aus. Service Time (ms) = 6.518721 Service Time (ms) = 10.364269 Service Time (ms) = 10.272689