gpt4 book ai didi

java - “warm up”线程究竟是多线程处理?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:50:45 25 4
gpt4 key购买 nike

我正在处理 Java 中的多线程,正如有人向我指出的那样,我注意到线程会预热,也就是说,它们会随着重复执行而变得更快。我想了解为什么会发生这种情况,是否与 Java 本身有关,或者它是否是每个多线程程序的常见行为。

示例代码(由 Peter Lawrey 编写)如下:

for (int i = 0; i < 20; i++) {
ExecutorService es = Executors.newFixedThreadPool(1);
final double[] d = new double[4 * 1024];
Arrays.fill(d, 1);
final double[] d2 = new double[4 * 1024];
es.submit(new Runnable() {
@Override
public void run() {
// nothing.
}
}).get();
long start = System.nanoTime();
es.submit(new Runnable() {
@Override
public void run() {
synchronized (d) {
System.arraycopy(d, 0, d2, 0, d.length);
}
}
});
es.shutdown();
es.awaitTermination(10, TimeUnit.SECONDS);
// get a the values in d2.
for (double x : d2) ;
long time = System.nanoTime() - start;
System.out.printf("Time to pass %,d doubles to another thread and back was %,d ns.%n", d.length, time);
}

结果:

Time to pass 4,096 doubles to another thread and back was 1,098,045 ns.
Time to pass 4,096 doubles to another thread and back was 171,949 ns.
... deleted ...
Time to pass 4,096 doubles to another thread and back was 50,566 ns.
Time to pass 4,096 doubles to another thread and back was 49,937 ns.

即它变得更快并稳定在 50 ns 左右。这是为什么?

如果我运行此代码(重复 20 次),然后执行其他操作(假设对先前结果进行后处理并为另一轮多线程做准备),然后在相同的 上执行相同的 Runnable >ThreadPool再重复20次,它已经预热了,无论如何?

在我的程序中,我只在一个线程中执行 Runnable(实际上我的每个处理核心一个,它是一个 CPU 密集型程序),然后交替执行其他一些串行处理多次。它似乎并没有随着程序的进行而变得更快。也许我可以找到一种方法来加热它……

最佳答案

不是线程像 JVM 那样预热。

JVM 具有所谓的 JIT(即时)编译。当程序运行时,它会分析程序中发生的事情并即时优化它。它通过获取 JVM 运行的字节代码并将其转换为运行速度更快的 native 代码来实现这一点。它可以以最适合您当前情况的方式执行此操作,因为它通过分析实际运行时行为来执行此操作。这可以(并不总是)产生很好的优化。甚至比一些在没有此类知识的情况下编译为 native 代码的程序更是如此。

您可以在 http://en.wikipedia.org/wiki/Just-in-time_compilation 阅读更多内容

当代码加载到 CPU 缓存中时,您可以对任何程序产生类似的效果,但我相信这将是一个较小的差异。

关于java - “warm up”线程究竟是多线程处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5198575/

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