打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
为什么说Go的Web框架在速度上输给Java?
userphoto

2023.10.29 湖北

关注

Hi!这里是W3Cschool编程狮的小狮妹!

你可能看过一些网上的跑分测试,显示Go的web框架在各种指标上都比Java的web框架要差。你可能会很疑惑,为什么Go的web框架速度还不如Java?难道Go语言不是号称比Java更快吗?

其实要想真正理解Go和Java的web框架之间的性能差异,我们需要从三个方面来分析。

编译方式

我们要明白一点,Java和Go都是编译型的语言。这意味着它们都会把源代码转换成机器可以直接执行的代码。但是,它们的编译方式并不相同。

Java的编译分为两个步骤:

  • 第一步是从源代码到字节码(bytecode),也就是.class文件。我们日常看到的java jar包,其实就是字节码的分发形式。
  • 第二步是在运行时,java虚拟机(JVM)会和即时编译器(JIT)合作,把字节码在需要的时候编译成本地代码(native code)。这样可以根据运行环境和程序状态进行优化。

Go的编译只有一个步骤:

  • 直接从源代码到本地代码。Go没有虚拟机或者即时编译器,它只生成一种平台相关的可执行文件。

那么这两种编译方式哪一种更快呢?

答案是:视情况而定。

有时候Java的即时编译器可以利用运行时信息进行更好的优化,使本地代码更高效。有时候,Go的直接编译可以避免虚拟机和即时编译器带来的开销,使得本地代码更简洁。

所以说呢,你看网上那些跑分比较,其实大家跑的都是本地代码。但是,这些本地代码并不一定代表了语言本身的性能优劣。它们还受到了编译器和运行环境的影响。

IO模型

web框架不单单要看中对语言的执行效率,还要看IO的效率。IO就是输入输出,也就是程序和外部设备(比如网络、硬盘、键盘等)之间的数据交换。

为什么说IO很重要呢?

因为在web应用中,我们经常要处理大量的网络请求和响应。如果我们不能及时地处理IO事件,那么程序就会被阻塞(block),无法继续执行其他任务。这样就会降低web应用的吞吐量(throughput)和响应时间(response time)。

如何提高IO效率?

有两种常见的方法:

  • 同步IO(synchronous IO)
  • 异步IO(asynchronous IO)

同步IO就是说,在处理一个IO事件时,程序必须等待该事件完成后才能继续执行其他任务。这样可以保证程序逻辑的简单和清晰,但是也会造成资源浪费和性能下降。

异步IO就是说,在处理一个IO事件时,程序可以立即返回,继续执行其他任务。当该事件完成后,程序会收到一个通知,再去处理该事件的结果。这样可以保证程序的高效和并发,但是也会增加程序逻辑的复杂和难度。

那么Java和Go的web框架分别采用了哪种IO模型呢?

答案是:都是异步IO。

Java的很多web框架,比如Spring Boot,都支持异步IO。它们通常使用线程池(thread pool)来管理多个并发的IO任务。每个线程都可以处理一个IO事件,当该事件完成后,线程会被回收或者复用。

Go的web框架,比如Gin,也支持异步IO。它们通常使用协程(goroutine)来管理多个并发的IO任务。每个协程都可以处理一个IO事件,当该事件完成后,协程会被回收或者复用。

那么,线程和协程有什么区别呢?

线程是操作系统层面的概念,它是CPU调度的基本单位。每个线程都有自己的栈(stack)和寄存器(register),用来保存程序状态。线程之间的切换需要操作系统的干预,会带来一定的开销。

协程是编程语言层面的概念,它是一种轻量级的线程。每个协程都有自己的栈,但是共享寄存器。协程之间的切换由编译器或者运行时控制,不需要操作系统的干预,开销很小。

线程和协程哪一种更好?

答案是:视情况而定。

有时候,线程可以利用多核CPU的并行计算能力,提高程序的执行效率。有时候,协程可以减少内存占用和上下文切换的开销,提高程序的并发能力。

在IO方面,Java和Go的web框架其实都采用了类似的技术。它们都借助了Linux操作系统中的epoll等机制来减少进程阻塞。于是很多跑分中,语言的执行效率变得次要,在充分优化和合理使用非阻塞IO的情况下,一些解释型语言也能取得很好的成绩。

实际应用场景

最后,也是最重要的,我们要考虑实际应用场景。因为在实际应用中,我们不仅要关注web框架本身的性能,还要关注业务逻辑和上下游服务的性能。

其实你看那些跑分测试,框架本身的性能都好得不得了。它们都是在理想化的环境下进行的,没有考虑到网络延迟、数据库访问、缓存命中、异常处理等因素。这些因素在实际应用中都会影响web应用的性能表现。

而且在实际应用中,我们的业务逻辑会更复杂,上下游服务也会更多。比如说,在一个电商网站中,我们可能要处理用户注册、登录、浏览、搜索、购物车、订单、支付、物流、评论等功能。

这些功能涉及到了用户信息、商品信息、库存信息、订单信息、支付信息、物流信息等数据。这些数据可能分布在不同的数据库、缓存、消息队列等服务中。我们需要通过网络请求来获取或者更新这些数据。

你想想看,在这样一个复杂的系统中,web框架本身能够承担多少性能的压力呢?很可能是数据库、缓存、消息队列等服务。这些服务的性能受到了数据量、并发量、网络带宽、硬件配置等因素的影响。如果这些服务出现了性能瓶颈,那么web框架再快也没用。

所以说呢,在实际应用中,web框架的性能并不是决定因素。我们应该更多地从开发难易程度,以及以后项目长期维护的成本上来选择语言和框架,而不是看跑分。

结语

通过以上的分析,我们可以得出以下几点结论:

  • Go和Java都是编译型的语言,但是它们的编译方式不同。Java使用字节码和即时编译器,Go使用直接编译。这两种方式各有优劣,不能一概而论。
  • Go和Java的web框架都支持异步IO,但是它们使用不同的技术。Java使用线程池,Go使用协程。这两种技术各有优劣,不能一概而论。
  • 在实际应用中,web框架的性能并不是决定因素。我们应该更多地考虑业务逻辑和上下游服务的性能,以及开发和维护的成本。

所以,Go的web框架为什么不如Java快?原因竟然是这样的!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JVM性能优化
Java HotSpot性能引擎的体系结构
程序员升级指南之编程语言
关于C 11的学习心得及两个小轮子分享
Java中堆内存和栈内存详解
Java中堆内存与栈内存分配浅析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服