Время обслуживания прямо пропорционально количеству потоков
У меня система i5-Dual core с гиперпоточностью. Windows показывает мне 4 процессора. Когда я запускаю одну оптимизированную задачу, связанную с процессором, одним потоком за раз, его время обслуживания всегда отображается около 35 мс. Но когда я передаю 2 задачи двум потокам, время их обслуживания составляет около 70 мс. Я хочу спросить, что в моей системе 4 процессора, тогда почему время обслуживания составляет около 70 в случае, когда 2 потока выполняют задачи teir, тогда как 2 потока должны работать на 2 процессорах без каких-либо накладных расходов на планирование. Ниже приведены коды.
CPU-Bound Task заключается в следующем.
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));
}
}
Поток, запускающий задачу, выглядит следующим образом.
public class TaskRunner extends Thread {
CpuBoundJob job=new CpuBoundJob();
public void run(){
job.run();
}
}
И наконец, основной класс выглядит следующим образом.
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();
}
Окончательный вывод:
Разогрев завершен! Теперь начните тестирование. Сначала запустите один поток за раз. Время обслуживания (мс) = 5.829112 Теперь запустите 2 потока за раз. Время обслуживания (мс) = 6.518721 Время обслуживания (мс) = 10.364269 Время обслуживания (мс) = 10.272689