🐷

Rust を始めました

に公開

Rust を始めました

C++ 好きとしては外せない? Rust の学習を始めてみました。

Rust とは

特徴

Rust については調べたらいろいろわかるのですが、3 大特徴を挙げておきます。

  • 処理速度が速い
  • 極めて高い安全性(メモリ、型、スレッドの各安全性)
  • 効率的な並行処理が可能

標準で単体テストが揃ってたりするところもいいですね。

C/C++ の代替として利用が広がる

性能が要求される OS カーネルとかゲームエンジンあたりへの採用が進んでいきそうです。

人気

Stack overflow 2022年 の調査より

  • 最も利用されている言語 :14 位(← 16 位 ← 19 位)
  • 最も愛されている言語  : 1 位(7 年連続)
  • 使用していないが学びたい言語 : 1 位(← 5 位 ← 5 位)

※()内は過去年度からの推移。すべて上昇傾向にあるのがわかります。

Rust と LLVM

Rust は LLVM の上に構築されているとのことで、イメージとしては以下のような感じっぽい。

つまり、LLVM の最適化の恩恵が受けられるということ!

使ってみよう

学習の手始めの題材としては、C/C++ との速度比較でもしてみよう。
学習したてだとロクにまともな Rust も書けないので、いろんな記事も参考に。

ということで、Spigot アルゴリズムを用いた円周率 2,400 桁(小数点以下 2,399 桁)を計算させてみました。

作ったもの

  • 円周率を 4 桁ずつ計算して Console 画面に出力。(計:2,400 桁)
  • x64 Console Application

結果

計測は両方とも release 版(C/C++ は速度最適化)。
5 回計測し、平均をとる。

処理時間
C/C++ 45 ms
Rust 21 ms

おや? Rust 速くない?
4 桁ずつの結果表示も処理時間に含むので、表示処理を無くしてみよう。

処理時間
C/C++ 0 ms(1 ms 未満)
Rust 25 ms

えっ? Rust 増えてる。意味不明(→ 測定誤差の範囲です)。

所感

  • たかだか 2,400 桁程度の計算では時間が短すぎて比較には不適切だった。てか、実は書く前からうすうすわかってたんですが。
  • C/C++ は計算処理よりも Console 出力のほうが桁違いに処理時間がかかることも改めて自覚。
  • もうちゃんとした計測はされていて、Rust が C/C++ 並みに速いこともわかってますよね。少なくとも C# や Java とかよりずっと速いです。
  • でも、自分でやってみたかったんです。
  • まぁ Rust が充分速いことだけは実体験として理解できました。(ここが一番重要!)

もう少し深堀

Rust のほうがバイナリサイズが大きい

サイズ
C/C++ 13 KB
Rust 167 KB

ほぼ同じコードなのに 10 倍以上大きい。

おそらくこれは以下のようになっているため。

C/C++ バイナリ
├ C ランタイム DLL
└ C++ ランタイム DLL

Rust バイナリ
└ C ランタイム DLL

つまり、Rust の 標準 API コードはバイナリ本体に静的にバインドするためかと。

Rust バイナリも C ランタイムに依存しているの?

C/C++ バイナリが C ランタイムおよび C++ ランタイムに依存しているのは当たり前。
でも、Rust バイナリも C ランタイムに依存していた!

Windows 環境だと、Rust の開発には Visual Studio もしくは Microsoft C++ Build Tools が必要です。Linux などでも Rust 開発環境には gcc が必要なので、てっきり Rust のビルドシステムが C/C++ のツールを必要とするのかと思っていたので、これは新しい発見。

Rust バイナリは C ランタイムの何を使っているのか?

ほほぅ。メモリ関数とな。

付録

作った環境

  • Windows 11 Pro 22H2
  • 第 8 世代 Intel Core i7 CPU 機(2018年製 PC)
  • Visual Studio 2022 Community version 17.7.4
  • rustc 1.72.1

ソースコード

同じ計算結果が出ることは確認しています。

最後に Rust をもっと知るために

Discussion