为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

芜湖不芜 2023-10-12 16:45:20
我正在制作一个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: 169Total time: 1.0Total prime numbers with threads: 169Total time: 3.0如果我的内容很混乱,我很抱歉,这是我第一次在这里发帖,而且我是编程新手。太感谢了。
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

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

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


查看完整回答
反对 回复 2023-10-12
  • 1 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信