现在的技术条件,运行100万个并发任务需要多少内存?

AIGC动态1个月前发布 damoxingLab
262 0 0
现在的技术条件,运行100万个并发任务需要多少内存?

 

文章摘要


【关 键 词】 异步编程内存消耗编程语言性能测试并发任务

在2024年的基准测试中,针对不同编程语言异步编程内存消耗进行了重新评估。测试程序启动N个并发任务,每个任务等待10秒后程序退出,重点关注协程而非多线程。测试涉及Rust、C#、NodeJS、Python、Go和Java等语言,所有代码可在GitHub查看。

Rust使用tokio和async_std创建程序,C#利用async/await特性,NodeJS通过Promise.all管理任务,Python使用asyncio,Go依靠goroutine和WaitGroup,Java自JDK 21起引入虚拟线程。测试环境为13th Gen Intel Core i7-13700K处理器,Debian GNU/Linux 12操作系统。

结果显示,在最小内存占用测试中,Rust、C#(NativeAOT)和Go表现相似,因为它们被静态编译成原生二进制文件,所需内存非常少。Java(GraalVM native-image)表现也不错,但消耗的内存稍多。在处理10K任务时,Rust和C#(NativeAOT)内存消耗几乎没有增长,表现令人满意。Go的内存消耗急剧增长,Java中的虚拟线程(GraalVM native image)比Go的goroutine更轻量。

当任务数增加到100K时,所有语言的内存消耗开始明显增加,Rust和C#表现优秀。C#(NativeAOT)甚至比Rust消耗内存更少,击败所有其他语言。Go不仅被Rust超越,还被Java、C#和NodeJS超越。

在1 Million Tasks的极限情况下,C#毫无疑问地击败所有其他语言,Rust在内存效率方面继续表现出色。Go与其他语言的差距拉大,内存消耗是第一名的13倍,是Java(除GraalVM外)的2倍。

总结来说,尽管许多并发任务并未执行复杂操作,但它们仍然会消耗大量内存。不同语言的运行时有不同的权衡,一些运行时在任务数量较少时表现轻量高效,但在处理数十万个任务时扩展性较差。自去年以来,.NET有巨大改进,NativeAOT的.NET在与Rust的竞争中也非常有优势。使用GraalVM构建的Java原生镜像在内存效率方面也很不错。但是,goroutine在资源消耗方面仍然低效。

“极客训练营”

原文和模型


【原文链接】 阅读原文 [ 1655字 | 7分钟 ]
【原文作者】 AI大模型实验室
【摘要模型】 moonshot-v1-32k
【摘要评分】 ★★★☆☆

© 版权声明
“绘蛙”

相关文章

暂无评论

暂无评论...