Rustの実行速度が速い理由


目的

Rustの実行速度が速い理由を知る。

まとめ

①直接機械語にコンパイルされる。
②ゼロコスト抽象化
③GCがない

Rustの実行速度

様々なアルゴリズムでの速度比較
左からC++、Rust、C
数値が低いほど早い。RustはC,C++と同程度に速いとされている。

Rustのコンパイラ

Rustのコンパイル

RustはC、C++同様に直接機械語を生成している。Rustのコンパイラは機械語生成にLLVMを使用している。
Rustについて

pythonは実行時にバイトコード(中間コード)を生成し、仮想マシンPVM(python virtual machine)で実行するため遅い。
参考

アセンブラの確認

cargo rustc --release -- --emit asm で最適化されたアセンブラを出力可能。
\target\release\depsに.sファイルが作成される。

ゼロコスト抽象化

抽象化のコスト(実行速度の低下やメモリ使用量の増加)を限りなくゼロにしているため速い。
もとはC++の概念。(ゼロオーバーヘッド原則)

静的ディスパッチで事前に対応する関数などを生成しているためオーバヘッドがなくなる、インライン化など最適化しやすい。
動的ディスパッチにも対応しているため、実行時に型が決まる場合にも対応可能。

qiita.rs
//共通のメソッドを実装するように促す仕組み
//これがないと同じ名前の関数は使用できない
trait  Show{
  fn show(&self);
}

struct Car;
struct RacingCar;

//implで構造体にメソッドを持たせる
impl Show for Car{
  fn show(&self){
    println!("Car");
  }
}

impl Show for RacingCar{
  fn show(&self){
    println!("RacingCar");
  }
}

fn main() {
  let car=Car{};
  car.show();//静的ディスパッチ

  let caa=RacingCar{};
  caa.show();//静的ディスパッチ

  let Car_vec:Vec<Box<dyn Show>>=vec![Box::new(Car),Box::new(RacingCar)];
  for i in Car_vec{
    i.show();//動的ディスパッチ
  }

}

pythonは動的型付き言語であるため、最適化がしにくく遅い。なぜpythonが遅いのか

ゼロコスト抽象化の効果の確認

参考

ガベージコレクション(GC)がない

ガベージコレクションとは:プログラムが使用しなくなったメモリ領域を自動的に解放して他のプログラムが使えるようにすること。

GCがある言語はメモリの管理を考えずにコードを書ける代わりに、GCが行われることで処理が停止するため、実行速度が遅くなる。

JavaのGC:世代別ガベージコレクション

GCまとめ

どうやってガベージコレクションをなくした?
所有権と借用の仕組みによる。