我正在尝试在AWS上的c4.large实例(具有两个核心的机器)上使用Java 1.8和Ubuntu在两个线程中执行计算。在添加第二个线程后,每个线程的计算速度从26秒放慢到34秒。我检查了核心的使用情况,添加第二个线程后,第二个核心的使用率达到了100%。
在具有双核处理器的本地计算机上,两个线程不会减慢线程速度。
如何改进下面的代码或更改系统配置以提高性能?c4.large实例:
线程0启动
线程0时间:26秒
线程1启动
线程0时间:29秒
线程1时间:34秒
线程0时间 :34秒
线程1时间:34秒
线程0时间:34秒
import java.io.IOException;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.DoubleUnaryOperator;
import java.util.stream.DoubleStream;
public class TestCalculate {
private Random rnd = ThreadLocalRandom.current();
private DoubleStream randomPoints(long points, double a, double b) {
return rnd.doubles(points)
.limit(points)
.map(d -> a + d * (b - a));
}
public static void main(String[] args) throws SecurityException, IOException {
DoubleUnaryOperator du = x -> (x * Math.sqrt(23.35 * x * x) / Math.sqrt(34.54653324234324 * x) / Math.sqrt(213.3123)) * Math.sqrt(1992.34513213124 / x) / 88392.3 * x + 3.234324;
for (int i=0 ; i < 2; i++){
int j = i ;
new Thread(() -> {
TestCalculate test = new TestCalculate();
int x = 0;
System.out.println("Thread "+j+" start");
long start = System.currentTimeMillis();
while (x++ < 4) {
double d = test.randomPoints(500_000_000l, 2, 10).map(du).sum();
long end = (System.currentTimeMillis() - start) / 1000;
System.out.println("Thread "+j+" time: "+end+" seconds, result: "+d);
start = System.currentTimeMillis();
}
}).start();
try {
Thread.sleep(40_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
TestCalculate
对象来处理每个线程的新版本? - BeeOnRope