Go vs. Rust:Web服务性能

Go vs. Rust:Web服务性能

哪个更能处理高流量?

图片链接

Go已经在Web开发领域确立了自己作为一个强大而高效的语言的地位。它的简洁性、性能和对并发的强支持使其成为构建可扩展分布式系统、特别是在云原生环境中的流行选择。Go以实用性和开发者生产力为设计核心,已经成为专注于高吞吐量应用和微服务架构的团队的标配。

另一方面,Rust作为一种高性能的系统级编程语言,已经获得了巨大的流行。以其对安全性、内存效率和零成本抽象的关注而闻名,Rust越来越多地被采用在性能至关重要的领域,包括Web服务。虽然传统上用于系统级编程,但其不断扩大的生态系统和像Actix这样的框架使Rust成为Web开发任务的强有力竞争者。

在这篇文章中,我将通过实现和比较Go和Rust中的CPU密集型Web服务来探索这两种语言的性能特点。

引言

让我们开发Go和Rust的Web服务来比较两个文本的相似度,并使用词频-逆文档频率(TF-IDF)余弦相似度算法返回它们的结果。这些算法在自然语言处理和信息检索中被广泛用于衡量文本数据的相关性和相似度。在深入实现之前,我们先来解释这些算法是如何工作的。

词频-逆文档频率(TF-IDF)

TF-IDF是一种统计度量,用于评估一个词在文档中的相对重要性,相对于一组文档。它结合了两个度量:

词频(TF): 表示一个词在文档中出现的频率相对于该文档总词数的比例:

图片链接

逆文档频率(IDF): 减少常见词(例如“the”、“and”)的权重,这些词出现在多个文档中。

图片链接

当结合使用时,TF-IDF突出显示在特定文档中频繁出现但在语料库中罕见的词,使它们在比较中更相关。

余弦相似度

余弦相似度是一种度量两个向量之间相似度的度量,不考虑它们的大小。在文本比较的背景下,这些向量代表文本中词的TF-IDF得分。相似度是作为向量之间角度的余弦值来计算的:

图片链接

值的范围:

  • 1 表示完全相同的文本。
  • 0 表示完全不同的文本。
  • 两者之间的值显示不同程度的相似性。

这些算法相辅相成:TF-IDF将原始文本转换为捕捉词重要性的数值表示,而余弦相似度量化这些表示之间的关系。它们共同构成了文本相似度分析的坚实基础。

开发

现在,让我们在Rust和Go中开发Web服务。首先,我们从Rust开始:

[Rust代码省略]

这段Rust代码使用Actix-web框架实现了一个Web服务,用于比较两个文本输入的相似度。它对文本进行归一化(去除标点符号并转换为小写),将其分词为单词,并计算词频。

此外,这是部署这个Rust服务所需的Dockerfile:

[Dockerfile代码省略]

现在让我们转向Go:

[Go代码省略]

这是用Fiber实现的相同功能,但用Go编写。现在让我们看看Dockerfile:

[Dockerfile代码省略]

我写了一个简单的k6测试来模拟对Go和Rust服务的负载。测试使用包含文本数据的CSV文件来生成/similarity端点的随机输入对。以下是测试脚本:

[测试脚本代码省略]

以下是对两个服务进行8分钟负载测试的结果!

Rust结果

请求: 完成1,865,618个请求,仅有13个失败(约0.00%的失败率)。

吞吐量: 每秒3,887个请求。

响应时间:

  • 平均:90.77ms
  • 中位数:74.79ms
  • 90百分位数:161.71ms
  • 95百分位数:219.01ms

带宽:

  • 发送数据:38 GB
  • 接收数据:310 MB

Rust展示了高吞吐量,请求失败极少,大多数请求的响应时间相对一致,保持低延迟。

Go结果

请求: 完成960,483个请求,0个失败(100%成功率)。

吞吐量: 每秒2,001个请求。

响应时间:

  • 平均:177.35ms
  • 中位数:22.28ms
  • 90百分位数:651.66ms
  • 95百分位数:905.77ms

带宽:

  • 发送数据:19 GB
  • 接收数据:159 MB

Go处理的请求数量比Rust少,但表现出一致的可靠性,没有失败。响应时间变化更大,平均值和95百分位数更高,表明在增加负载下性能一致性较差。

比较

图片链接

图片链接

图片链接

吞吐量:

  • Rust处理的请求数量几乎是Go的两倍。
  • Rust实现了更高的每秒请求率(3,887 vs. 2,001)。

响应时间:

  • Rust的平均响应时间比Go快,但Go的中位数响应时间更低。
  • Go显示出更高的响应时间变异性,95百分位数显著增加。

可靠性:

  • 两个服务都表现出极好的可靠性,但Go有完美的成功率(100%,而Rust为99.99%)。

资源利用:

  • Rust发送的数据是Go的两倍(38 GB vs. 19 GB)。

应用代码

你可以在这里找到项目的完整代码:

GitHub - misikdmytro/text-similarity

如果你发现它有帮助,不要忘记给仓库加星 —— 你的支持意义重大!🌟

结论

Rust和Go各有优势,选择它们之间的哪一个取决于你的优先级。

如果速度是你最关注的问题,Rust是冠军。它的性能明显更快,使其成为对每一毫秒都至关重要的高性能应用的理想选择。但这里有个问题:编写Rust代码感觉像是在解谜。它很强大,但需要更多的努力来确保一切恰到好处。

另一方面,Go就像一个总是能顺利完成工作的友好邻居。代码更简单,更容易编写和维护,这使得它成为快速构建可靠系统的理想选择 —— 尤其是当性能“足够好”的时候。

简而言之,如果你在追求原始速度并且不介意更陡峭的学习曲线,Rust是你的冠军。但如果你想让事情更简单并且更快地交付,Go是你最好的选择。

两者都是赢家 —— 这取决于你正在玩的游戏!🏆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值