java - Java中的多线程查找素数需要更多时间?
问题描述
我试图找出这个问题的解决方案,但无法在 StackOverflow 上找到它?
我只想知道为什么我的多线程工作如此缓慢,事实上它应该相反。
public class Prime {
static BufferedWriter writer;
static DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
public static void main(String[] args) throws IOException {
System.out.println("Without Thread" + findPrime() + " ms");
System.out.println("With thread : " + findPrimeWithThreads() + " ms");
}
public static long findPrimeWithThreads() {
Instant start = Instant.now();
int primaryNumber = 3;
while (primaryNumber <= 100000) {
int finalPrimaryNumber = primaryNumber;
new Thread(() -> {
multiplicationHelper(finalPrimaryNumber);
}).start();
new Thread(() -> {
multiplicationHelper(finalPrimaryNumber+1);
}).start();
primaryNumber+=2;
}
return Duration.between(start, Instant.now()).toMillis();
}
public static long findPrime() throws IOException {
Instant instant = Instant.now();
int primaryNumber = 3;
while (primaryNumber <= 100000) {
multiplicationHelper(primaryNumber);
primaryNumber++;
}
return Duration.between(instant, Instant.now()).toMillis();
}
public static void multiplicationHelper(int primaryNumber){
int j = 2;
boolean isPrime = true;
while (j <= primaryNumber/2) {
if (primaryNumber % j == 0) {
isPrime = false;
break;
}
j++;
}
if (isPrime) {
// System.out.println("PRIME :: " + primaryNumber);
}
}
}
这是代码,代码的输出是:
Without Thread497 ms
With thread : 22592 ms
请您详细说明为什么会这样以及如何提高多线程的性能? 我是多线程编程的新手,所以我在这方面做错了吗?
解决方案
“寻找素数”是一个计算密集型操作。它自然会使用 100% 的 CPU 利用率,因为它从不需要执行 I/O。
“多线程”的两个目的是:(a)利用多个 CPU 内核,以及(b)将计算与 I/O 重叠。(并且更容易发出并行 I/O 操作。)
多线程可以在正确的情况下节省时间,或者在错误的情况下花费更多的时间。
您考虑不周的设计似乎启动了 20,000 个线程!
推荐阅读
- amazon-web-services - 如何配置我的 EC2 实例运行 DPDK 以过滤弹性 IP 和另一个 ec2 实例之间的流量?
- python - Extracting name and number from a string
- ruby - 在 Firestore 中写入需要太多时间
- java - 如何使用 log4j 动态设置日志文件名,但在发出数据库请求之后?
- java - 为什么通知没有显示在 API 28 中?
- c - 如何将 VL53L0X 标头包含到我的 STM32L 项目中
- python - pythonscript将图片保存到文件时如何在网络服务器上显示图片?
- visual-studio-code - VSCode Jest 因 SystaxError 失败:意外的令牌 =
- python - 将(冻结的)Tensorflow 模型加载到内存中时出错
- python - pandas:将数据框写入 excel 文件 *object*(不是文件)?