10种编程语言版本网络驱动程序性能比较

一群来自德国大学的研究人员 опубликовала 发现 实验在此期间,用不同的编程语言开发了 10 个版本的 10 Gb Intel Ixgbe (X5xx) 网卡标准驱动程序。 该驱动程序在用户空间中运行,并使用 C、Rust、Go、C#、Java、OCaml、Haskell、Swift、JavaScript 和 Python 实现。 编写代码时,主要关注点是实现最佳性能,同时考虑每种语言的特性。 所有选项的功能都相同,由大约 1000 行代码组成。 项目进展 传播 在 BSD 许可下。

Rust 版本的驱动程序在性能上与 C 语言的参考驱动程序非常接近。 在同时发送 32 个数据包块的负载下,Rust 驱动程序稍显落后,但在每个块超过 32 个数据包的测试中,速度实际上与 C 驱动程序没有什么不同,并展示了处理 28 万个数据包级别的性能具有 Xeon CPU E3-1230 v2 3.3 GHz 的服务器上每秒的数据包数。

10种编程语言版本网络驱动程序性能比较

就性能而言,下一个利基市场是 Go 和 C# 语言的驱动程序,它们显示出相当接近的结果(Go 驱动程序在最多 16 个数据包的测试中获胜,并在超过 16 个数据包的测试中开始略有下降)在一个块中)。 每个块有 256 个数据包,C# 驱动程序的峰值性能约为每秒 28 万个数据包,Go 驱动程序约为每秒 25 万个数据包。

接下来,结果相当接近,是驱动程序
Java、OCaml 和 Haskell 已经明显落后于之前考虑的选项,无法克服每秒 12 万个数据包的限制。 Swift 和 JavaScript 驱动程序表现出更大的延迟,能够以每秒 5 万个数据包的水平处理流。

排名第一的是 Python 驱动程序,它每秒只能处理 0.14 万个数据包。 使用Python实现来评估没有JIT且没有特定优化的解释器的速度(代码使用CPython 3.7执行,与PyPy不兼容,但值得注意的是,数据存储结构的优化可以将性能提高约10倍)。

此外,还进行了延迟测试,以显示缓冲的有效性和垃圾收集器的影响。 测试测量了驱动程序转发每个数据包后的延迟与其发送的确切时间。 领先者仍然是 C 和 Rust 驱动程序,对于每秒 1 万个数据包(大约 20 µs)的流量,其结果几乎无法区分。 Go 驱动程序表现良好,仅略微落后于领先者,并且也保持在 20 µs 的水平。 C# 驱动程序显示大约 50 µs 的延迟。
JavaScript 和 Java 驱动程序显示了最长的延迟(延迟超过 300 µs)。

10种编程语言版本网络驱动程序性能比较

该研究的目的是评估用比 C 更高级的语言开发驱动程序和操作系统组件的可能性。 目前,Linux 中 39 个内存问题中有 40 个与驱动程序有关,因此使用更安全的语言并将驱动程序从内核移出到用户空间的问题 保持相关性 并且制造商已经在这个方向上积极尝试(例如,Google 为操作系统开发了 TCP 堆栈) 紫红色 Go语言,CloudFlare公司 创建 在 Rust 中实现 QUIC 协议时,Apple 已将移动设备上的 TCP 堆栈移至用户空间)。

在工作过程中,得出的结论是 Rust 语言是驱动程序开发的最佳候选者。 Rust 的功能消除了与低级内存管理相关的问题,但与 C 驱动程序相比,代价是大约 2% 到 10% 的性能损失。 Go 和 C# 也被认为适合在垃圾收集导致的亚毫秒级延迟可接受的情况下创建系统组件。

来源: opennet.ru

添加评论