首页 > 解决方案 > 为什么我的程序在使用线程时变慢了?

问题描述

我正在制作一个 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

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

标签: javamultithreading

解决方案


  1. 不要那样做基准测试,使用JMH。否则,由于 JIT 编译和 JVM 执行的 1001 优化,您将获得的数字几乎毫无意义。且不说单次运行 1ms 和 3ms 的差异,肯定不足以得出任何有意义的结论。JMH 多次运行相同的代码,以便 JVM 达到稳定状态,然后执行更多实际测量代码性能的运行。

  2. 线程不是你可以撒在一段代码上以使其更快的神奇粉末。线程具有与之相关的大量成本——线程创建和上下文切换是昂贵的操作。从外观上看,您正在执行的计算非常快。所以线程创建和上下文切换的成本实际上超过了算法本身的运行时间。


推荐阅读