AWSのRust推し記事に対するRuss Coxによる反駁
先日AWSが声明を出していた。たぶん、昨年の AWS Summit で発表していたキーノートが元ネタだったと思う。
実は Discord 周りの評価が誤っているのではないかという Go ユーザーによる反論がいくつか Twitter で見られており、なおかつ自分もあまりその点については納得していなかったので、今回の記事はシェアしなかった。ならびに、数年前の論文を元に Rust のエネルギー効率の良さを主張していたが、数年前(2017年)の成果だったから、今は状況が違うというのもあるだろうし、少し納得していなかった。
後日、日本語による解説記事が出されている。
この原文の記事に対して Russ Cox が Twitter で反駁を行っていた。続くスレッドにて解説があり、そのとおりだと思うのでまとめたいと思う。
簡単に内容をまとめると、
- 「Rust は省エネ」の引用元の論文の結果、本当に大丈夫?ちょっと怪しそうだけど。
- AWS は Discord の元記事を誤読している。
- それにより Go の結果が不当に解釈されている。
- 数年前の Go を今持ち出されてもなあ…Go も相当改善してるよ。
- Go か Rust か、みたいなゼロサムゲームの解説記事を読むんじゃなくて、Go と Rust をどう組み合わせたら現実のソフトウェアに上手にいかしていけるかを考えたほうがいいのでは?
といったところだろうか。
翻訳は筆者の手によるものです。だいたいの意味と当人のテンションを担保してある状態にしてあります。
「数年前のとてもおもしろい研究結果」というのが明らかに問題だ。まずはじめに、このペーパーは Intel i5-4460 CPU 上で Go 1.6(2016年2月時点の)を使用して2017年10月に公開された。これは「相当」前のことだ。
その上、「とてもおもしろい研究結果」では Computer Language Benchmarks Game を比較対象のソースとして仮定しているが、もしあなたがそのサイトを知っているならご存知のとおり、実際の姿からは程遠い。
注: この論文は、「Benchmarks Game のコードを使用してエネルギー使用量、実行時間そしてメモリ使用量を比較する」みたいな趣旨だったと思うが、Benchmarks Game のコード自体ならびにその結果と、現実のコンピュータ上でのアプリケーションによる計算とでは結構乖離があり、ちょっと現実離れしている。したがって比較対象に適さないのでは?という話はよくあがる。そのことを言っている気がする。
- Benchmarks Game: https://benchmarksgame-team.pages.debian.net/benchmarksgame/index.html
- 元論文: "Energy Efficiency across Programming Languages" https://greenlab.di.uminho.pt/wp-content/uploads/2017/10/sleFinal.pdf
研究結果がもし C++ が C より34%多くのエネルギー、56%の多くの時間そして14%多くのメモリを使用すると主張しているなら、想定を再検討する必要がある。ほぼすべての C プログラムは正当な C++ プログラムだから、C++ が負けることはないはずだ。とくに、こんなにも結果がひどくなるはずがない。
そういうわけで、「とてもおもしろい研究結果」はぜんぜんおもしろくなんかない。適度な懐疑心をもって結果を見るべきなのは明らかだ。
次に、Go から Rust に切り替えたという AWS による Discord の記事の要約はすさまじくミスリーディングだ。
もともとの Discord の記事は、Go のサーバーとそれを置き換えた Rust のサーバーの両方のプロットを1つのグラフ上に描いていた。Rust の線はより予測可能なパフォーマンスを示しており、Go の線におけるレイテンシーのスパイクを防いでいたが、Go と Rust のグラフの線はほぼ同等だった。
補足: 紫が Go の線で、水色が Rust の線。たしかにスパイクする時間帯は確かめられるが、それ以外の時間帯は Go も Rust もそんなに変わらないのでは、ということを言いたいのではないかと思う。
でも、AWS の記事は、新しいデータ構造とより多くの RAM を使用するために大幅に書き直したあとの Rust のサーバーのグラフと Go のグラフの結果を示し、「ms」vs「μs」のタイムスケールを丸で囲んでいた。このことは、Discord の記事を完全に誤解しているか見え透いたごまかしかのどちらかだ。
一応補足だが、Discord の記事はフェアだ。記事では Go のサーバーと Rust の同等の実装のサーバーの同一条件での比較を示した。この記事のもっとあとに、データ構造と追加の RAM の使用の書き直しを含む Rust サーバー単体でのグラフを示した。AWS の記事はそのことを間違えて説明しているのだ。
とはいえ、Discord の記事は Go 1.10 についての記述だ。Go 1.18 がもうすぐリリースされるのに、だ。この8つのバージョンのリリースの中にはたくさんの改善が含まれており、とくに非常に大きなヒープと非常に多くの goroutine を使用したプログラムにおける GC ポーズの削減なんかも含まれる(Discord サーバーは両方が該当した)。
だから、直近の Go を使ってもらえば Discord のレイテンシースパイクは驚くほど削減されるだろう。そして、我々はもっと改善するつもりだ。でもまだ Rust は Discord のサーバーにとってはよい言語であり、チームは妥当な判断をした(Go の改善を待ってくれてもよかっただろうけどね)。
AWS の記事は、Rust に関して真摯でフェアな主張をしている。ただ、Go について誤解を招くような記述をしたことは残念でならない。そんなことをする必要はなかった。Rust はそれ自体で十分に良いものだ。
Go vs Rust がゼロサムゲームかであるかのように扱うブログ記事を読む代わりに、私個人としてはむしろ、 Go と Rust がお互いを補完しあい、お互いにうまく機能し合う方法に焦点を当てたいと思う。