猿问

为什么使用线程时我的程序变慢?

我正在制作一个java程序,它比较计算两个给定数字之间的素数总数所需的时间。我必须计算顺序以及线程需要多少时间。


例如,我必须检查顺序计算需要多少时间:


PrimeNumbers pn = new PrimeNumbers (1,1000);

并将其与计算相同的事物但将其划分为多个线程所需的时间进行比较:


PrimeThread p1 = new PrimeThread (1, 200);

PrimeThread p2 = new PrimeThread (201, 400);

PrimeThread p3 = new PrimeThread (401, 600);

PrimeThread p4 = new PrimeThread (601, 800);

PrimeThread p5 = new PrimeThread (801, 1000);

我必须使用 System.currentTimeMillis() 来计算时间。线程应该能够更快地计算同样的事情,但实际上更慢。到目前为止我有这个代码:


PrimeNumbers pn = new PrimeNumbers(1,1000);


long startTimeSeq = System.currentTimeMillis();


int totalNumbersSeq = pn.calculatePrimeNumbers();


long finishTimeSeq = System.currentTimeMillis();


float totalTimeSeq = finishTimeSeq - startTimeSeq;



PrimeThread p1 = new PrimeThread (1, 200);

PrimeThread p2 = new PrimeThread (201, 400);

PrimeThread p3 = new PrimeThread (401, 600);

PrimeThread p4 = new PrimeThread (601, 800);

PrimeThread p5 = new PrimeThread (801, 1000);


long startTimeThread = System.currentTimeMillis();


p1.start();

p2.start();

p3.start();

p4.start();

p5.start();


try {

    p1.join();

    p2.join();

    p3.join();

    p4.join();p5.join();

} catch (InterruptedException e) {

    e.printStackTrace();

}



long finishTimeThread = System.currentTimeMillis();

float totalTimeThread = finishTimeThread - startTimeThread;


int totalNumbersThread = p1.getNumPrimers() + p2.getNumPrimers() + p3.getNumPrimers() + p4.getNumPrimers() + p5.getNumPrimers();    


System.out.println("Total prime numbers sequentially: " + numPrimers);

System.out.println("Total time: " + totalTimeSeq);


System.out.println("Total prime numbers with threads: " + resultatFinal);

System.out.println("Total time: " + totalTimeThread); 

打印的结果是:


Total prime numbers sequentially: 169

Total time: 1.0

Total prime numbers with threads: 169

Total time: 3.0

如果我的内容很混乱,我很抱歉,这是我第一次在这里发帖,而且我是编程新手。太感谢了。


芜湖不芜
浏览 87回答 1
1回答

郎朗坤

不要那样进行基准测试,请使用JMH。否则,由于 JIT 编译和 JVM 执行的 1001 次优化,您将获得的数字几乎毫无意义。更不用说单次运行中 1ms 和 3ms 的差异肯定不足以得出任何有意义的结论。JMH 多次运行相同的代码,以便 JVM 达到稳定状态,然后执行更多运行来实际测量代码的性能。线程并不是一种神奇的粉末,你可以撒在一段代码上以使其更快。线程具有与之相关的巨大成本 - 线程创建和上下文切换是昂贵的操作。从表面上看,您执行的计算速度非常快。因此,线程创建和上下文切换的成本实际上超过了算法本身的运行时间。
随时随地看视频慕课网APP

相关分类

Java
我要回答