gpt4 book ai didi

java - 为什么 Java 没有有效地利用我所有的 CPU 内核

转载 作者:太空狗 更新时间:2023-10-29 22:45:46 26 4
gpt4 key购买 nike

<分区>

我在一台有四核 cpu 的机器上运行 Ubuntu。我编写了一些测试 Java 代码,这些代码生成给定数量的进程,这些进程在运行时简单地为给定的迭代次数递增一个 volatile 变量。

我希望运行时间不会显着增加,而线程数小于或等于内核数,即 4。事实上,这些是我从 UNIX 使用“实时”的时间 时间命令:

1个线程:1.005s

2个线程:1.018s

3个线程:1.528s

4个线程:1.982s

5 个线程:2.479 秒

6个线程:2.934s

7个线程:3.356s

8个线程:3.793s

这表明添加 1 个额外的线程并没有像预期的那样增加时间,但是随着 3 和 4 个线程的增加,时间确实增加了。

起初我认为这可能是因为操作系统阻止了 JVM 使用所有内核,但我运行了 top,它清楚地显示了 3 个线程,3 个内核正在运行 ~ 100%,并且有 4 个线程,4 个内核已达到极限。

我的问题是:为什么在 3/4 CPU 上运行的代码与在 1/2 CPU 上运行时的速度不大致相同?因为它在所有内核上并行运行。

这里是我的主要方法供引用:

class Example implements Runnable {

// using this so the compiler does not optimise the computation away
volatile int temp;

void delay(int arg) {
for (int i = 0; i < arg; i++) {
for (int j = 0; j < 1000000; j++) {
this.temp += i + j;
}
}
}

int arg;
int result;

Example(int arg) {
this.arg = arg;
}

public void run() {
delay(arg);
result = 42;
}

public static void main(String args[]) {

// Get the number of threads (the command line arg)

int numThreads = 1;
if (args.length > 0) {
try {
numThreads = Integer.parseInt(args[0]);
} catch (NumberFormatException nfe) {
System.out.println("First arg must be the number of threads!");
}
}

// Start up the threads

Thread[] threadList = new Thread[numThreads];
Example[] exampleList = new Example[numThreads];
for (int i = 0; i < numThreads; i++) {
exampleList[i] = new Example(1000);
threadList[i] = new Thread(exampleList[i]);
threadList[i].start();
}

// wait for the threads to finish

for (int i = 0; i < numThreads; i++) {
try {
threadList[i].join();
System.out.println("Joined with thread, ret=" + exampleList[i].result);
} catch (InterruptedException ie) {
System.out.println("Caught " + ie);
}
}
}
}

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com