「Rust」言語はCよりも遅いのか、研究者がベンチマーク結果を解説モダンCPUでは性能低下は軽微

ミュンヘン工科大学の研究チームのメンバーはRust言語で開発したネットワークデバイスドライバの処理速度をC言語のものと比較した。その結果、Rust版の速度低下は最大でも数%にとどまっていた。なぜ処理性能がわずかに遅くなるのか、その理由も説明した。

» 2019年09月13日 20時00分 公開
[@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 「C」や「C++」に代わるシステムプログラミング言語として「Rust」が注目を集めている。メモリ安全性が高く、メモリ破壊バグといった脆弱(ぜいじゃく)性を作り込みにくいからだ(関連記事)。

 ただし、システムプログラミング言語では、高い処理性能が必須条件であり、これがCやC++が使われ続けている理由となっている。Rustはどの程度「速い」のだろうか。

 ドイツのミュンヘン工科大学で博士課程の学生であるポール・エメリク氏は2019年9月9日、Rustで作成したデバイスドライバの性能評価をGitHubで発表した。

 同氏のグループはさまざまな言語で同じ機能を備えたデバイスドライバを記述し、性能を比較している。

Cで記述したデバイスドライバの処理性能が常に最も高いものの、ある条件を満たすとRustのコード(青)が同じ性能を発揮した(出典:ポール・エメリク氏の「Rust-vs-C-performance.md」

何が性能低下を引き起こしているのか

 性能評価用に作成したのは、Intelのイーサネットコントローラー向けのLinux用デバイスドライバだ(ixgbeタイプ)。

 エメリク氏は解説の冒頭で研究に取り組んだ理由をはっきりと述べている。

 「Rust版がC版より遅いのは、当然ながらRustの安全機能に起因する。だが、それを定量化できるのだろうか」

 同氏によれば、Rustによる実装とCによる従来型の実装には大きな違いが2つしかないという。

  1. Rustは(配列へのインデックスアクセス時に)境界チェックを常に強制するが、Cの慣用的なスタイルでは境界チェックが含まれていない
  2. Cは、DMAバッファーのラッパーオブジェクトを必要とせず、全ての必要なメタデータをパケットデータの前に直接保存する。これはDMAバッファーと同じメモリ領域だ。だが、Rustのラッパーオブジェクトは、スタックに割り当てることができ、Cで使われるポインタをスマートポインタに効果的に置き換え、局所性によって生じるペナルティを軽減する

 つまり、境界チェックが、Rustのパフォーマンス上の主なデメリットとなっているという。

CPUパフォーマンスカウンタで評価してみると

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。