Время обслуживания прямо пропорционально количеству потоков

У меня система 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

Ответы на вопрос(2)

Ваш ответ на вопрос