虚拟线程JDK与Spring Core Reactor

news/2025/1/16 15:38:36/

两种虚拟线程对比:JDK vs. Spring Core Reactor性能对比

1、基于 JDK 的虚拟线程实现:
摘自实际代码:

  public static void withFlatMapUsingJDK() {
...
var virtualThreadExecutor = Executors.newThreadPerTaskExecutor(
Thread
.ofVirtual()
.name("jdk21-vt-", 0)
.factory()
);

    try (virtualThreadExecutor) { // Submit tasks for parallel processing List<CompletableFuture > futures =
users
.stream()
.map(user -> CompletableFuture.runAsync(() -> {
try {
log.info("Processing user: {}", user);
processSomeBizLogic(user);
successCount.incrementAndGet();
} catch (Exception e) {
log.error("Error occurred while processing user {}: {}", user, e.getMessage());
failureCount.incrementAndGet();
}
}, virtualThreadExecutor))
.toList(); // Collect CompletableFuture for each user // Wait for all tasks to complete CompletableFuture allOf = CompletableFuture.allOf(futures.toArray( new CompletableFuture[0]));
try {
allOf.join();
} catch (Exception e) {
log.error("Error waiting for all tasks to complete: {}", e.getMessage());
}
}
...
}

2、基于 Spring Core Reactor 的虚拟线程实现

  public static void withFlatMapUsingJDK() {
...
// Custom executor with virtual threads var virtualThreadExecutor = Executors.newThreadPerTaskExecutor(
Thread
.ofVirtual()
.name("rx-vt-", 0)
.factory()
);

    try (virtualThreadExecutor) {
Flux
.fromIterable(objectList)
.flatMap(obj ->
Mono
.fromCallable(() -> {
log.info("Entering processUser in virtual thread: {}", obj);
processSomeBizLogic(obj);
log.info("Leaving processUser in virtual thread: {}", obj);
successCount.incrementAndGet();
return obj;
})
.doOnError(error -> {
log.error("Error occurred while processing user {}: {}", obj, error.getMessage());
failureCount.incrementAndGet();
})
.onErrorResume(error -> {
log.info("Skipping user due to error: {}", obj);
return Mono.empty(); // Skip errored objects })
.subscribeOn(Schedulers.fromExecutor(virtualThreadExecutor)) // Use virtual threads )
.doOnComplete(() -> {
log.info("Processing completed");
log.info("Success count: {}", successCount.get());
log.info("Failure count: {}", failureCount.get());
})
.blockLast();
}
...
}

发处理列表中以下数量的对象

  1. 10 万对象
  2. 25万 个对象
  3. 50 万 个对象

结果:
处理整个列表所花费的总时间:

  • 与 Spring Core Reactor 相比,基于 JDK 实现的虚拟线程速度超快。
  • 此外,随着数据量的增加,基于 Spring Core Reactor 的应用程序处理时间缓慢呈指数增长,越来越极端慢。

内存占用:

  • 对于 10 万个对象,与基于 Spring Reactor 的实现相比,基于 JDK 的实现需要在旧代Old Gen 中分配 33 倍的内存
  • 对于 50 万个对象,与基于 Spring Reactor 的实现相比,基于 JDK 的实现在 旧代Old Gen 中使用的峰值内存是后者的 81 倍

GC 暂停:

  • ,基于 JDK 的实现的 GC 暂停时间更长。尽管基于 JDK 的实现的 GC 暂停时间更长,但这对应用程序的延迟没有任何显著影响。

CPU 时间:

  • 尽管基于 JDK 的实现需要更长的 CPU 时间来进行 GC 活动,但它不会对应用程序性能产生任何负面影响。

对象度量:

  • 尽管基于 JDK 的实现的对象创建率和提升率明显更高,但它对应用程序性能的影响却微乎其微。

总结

  • 对于基于虚拟线程的实现,JDK 应该是显而易见的选择,因为它们比 Spring Core Reactor快得多。
  • 对于基于平台线程的实现,Spring Core Reactor比基于​​ JDK 的实现相对更快

http://www.ppmy.cn/news/1563644.html

相关文章

Docker Desktop 中安装 MySQL 并开启远程访问的详细教程

是在 Docker Desktop 中安装 MySQL 并开启远程访问的详细教程&#xff1a; 一、安装 MySQL 容器 拉取 MySQL 镜像&#xff1a; docker pull mysql:latest这将从 Docker Hub 上拉取最新版本的 MySQL 镜像。如果你想使用特定版本的 MySQL&#xff0c;可以将 latest 替换为具体…

UML系列之Rational Rose笔记九:组件图

一、新建组件图 二、组件图成品展示 三、工作台介绍 最主要的还是这个component组件&#xff1b; 然后还有这几个&#xff0c;正常是用不到的&#xff1b;基本的使用第四部分介绍一下&#xff1a; 四、基本使用示例 这些&#xff0c;主要是运用package还有package specifica…

Unity 视频导入unity后,播放时颜色变得很暗很深,是什么原因导致?

视频正常播放时的颜色&#xff1a; 但是&#xff0c;当我在unity下&#xff0c;点击视频播放按钮时&#xff0c;视频的颜色立马变得十分昏暗&#xff1a; 解决办法&#xff1a; 将File—BuildSettings—PlayerSettings—OtherSettings下的Color Space改为&#xff1a;Gamma即可…

C#实现条形码识别

见过不少人、经过不少事、也吃过不少苦&#xff0c;感悟世事无常、人心多变&#xff0c;靠着回忆将往事串珠成链&#xff0c;聊聊感情、谈谈发展&#xff0c;我慢慢写、你一点一点看...... 1.使用Nuget安装第三方库 dotnet add package ZXing.Netdotnet add package ZXing.Net.…

力扣经典练习题之40,组合总和2

今天继续给大家分享一道力扣的做题心得今天这道题目是 40 &#xff0c;组合总和 题目如下&#xff0c;题目链接&#xff1a;40. 组合总和 II 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 c…

【PCIE734-1 】基于 PCIe 总线架构的 XCKU060 FPGA 4 路 SFP+光纤通道处理平台

产品概述 PCIE734-1 是一款基于 PCIE 总线架构的 Kintex UltraScale 系列 XCKU060 FPGA 高性能 4 路 SFP光纤数据处理平台。该平台具有 1 个 PCIe Gen3 x8 主机接口、4 个 SFP 10G 光纤接口&#xff0c;可以实现 4 路 SFP 10G 光纤的数据实时采集、处理、传输。板 卡 采 用 Xi…

CentOS 9 Stream 中查看 Python 版本并升级 Python

CentOS 9 Stream 中查看 Python 版本并升级 Python 1. 查看当前 Python 版本2. 升级 Python 版本&#xff08;1&#xff09;安装开发工具&#xff08;2&#xff09;安装必要的依赖包&#xff08;3&#xff09;下载和安装新版本的 Python&#xff08;4&#xff09;验证安装 3. …

【算法学习笔记】33:快速幂的递归及循环实现

快速幂原理 要计算 a b a^b ab&#xff0c; a b m o d p a ^ b~mod~p ab mod p&#xff0c;可以考虑用折半的方式缩小计算量。 例如要计算 2 13 2^{13} 213&#xff0c;只要计算 2 6 2^6 26乘以自己&#xff0c;再乘以一个多出来的2。 而要计算 2 6 2^6 26&#xff0c;只要计…