mruby/c 3.1 をリリースしました
2022年06月27日
mruby/c 3.1を公開しました。
mruby/c 3.1では、Ruby3.0系およびmruby3.1に準拠して、メジャーアップデートを行いました。
これまで、パフォーマンスの向上、例外処理の機能改善、Ruby3.0系およびmruby3.1に準拠した内部改善を目的に開発を行いました。
これにより mruby/c 3.1では、実行開始時にシステムが必要とするRAM使用量が約5.4KBと、mruby/c 2.0と比較して半分以下の大幅な省メモリ化を達成しました。
また、実行速度は、ベンチマークの結果、mruby/c 2.0と比較して、最大1.8倍の高速化を実現しました。
mruby/c 3.1リリースに関する詳細、変更点を以下のとおり紹介します。
パフォーマンスの向上
- mruby/c 3.1ではmruby/c 2.0と比較して、1.5〜1.8倍の高速化を実現しました。
- これは主に、メソッドコールのためのキャッシュテーブル等を採用した効果です。
- 実行速度のベンチマークとして、プログラムを以下のとおり公開しております。
https://github.com/mrubyc/support_tools/tree/main/benchmarks
ベンチマーク種類 | 平均実行速度(s) |
向上率(倍) | |
ver2.0 | ver3.1 | ||
ハノイの塔 | 9.394 | 5.893 | 1.59 |
フィボナッチ | 49.768 | 31.212 | 1.59 |
eの収束 | 27.941 | 19.133 | 1.46 |
マージソート | 39.769 | 22.257 | 1.79 |
※詳細なベンチマークの計測方法と結果は、後述する「ベンチマーク結果(実行速度)」をご査収ください。
フットプリントの低減(RAM)
- mruby/c 3.1では、mruby/c 2.0と比較して、実行開始時にシステムが必要とするRAM使用量を、約6割低減し、大幅な省メモリ化を実現しました。
- これは、メモリ管理モジュールの改良とともに、組込ライブラリやそのシンボル類など、起動時から必要になるデータ類を切り分け、積極的にROMへ配置するよう設計変更を行った成果です。
- 詳細なベンチマークの結果は、後述する「ベンチマーク結果(メモリ使用率)」をご査収ください。
例外処理の機能改善
- mruby/c VMがランタイムエラー時に例外を発生させることができるようになりました。
- 例: 0による除算→ZeroDivisonError例外発生
- そのため、ユーザーレベルで発生させた例外に加えてシステムレベルでの例外もハンドルできるようになり、より安全なプログラムを書くことができるようになります。
- また、Rubyプログラムによるraiseだけではなく、C言語でメソッドを書くときにも、mrbc_raise関数を使ってRubyへ例外を返すことができるようになりました。
内部変更
- Ruby3.0系およびmruby3.1に準拠して、以下の仕様に変更されました。
- クラス名が「Fixnum」から「Integer」へ変更
- 例外クラス(Exception全般)の変更
※詳細はクラス・ライブラリ一覧の「クラスツリー」をご査収ください。
- 致命的エラー発生時のC言語レベルでのハンドラを、以下のとおり定義しました。
- メモリ不足時:MRBC_OUT_OF_MEMORYマクロ
- 例外がRubyでキャッチされなかった時:MRBC_ABOUT_BY_EXCEPTIONマクロ
- halに、hal_abort関数を追加しました。
リリースバージョンについて
- mruby/cは、リリースバージョンとして3.0をスキップして、今回の3.1をリリースしています。
- その理由として、以下が挙げられます。
- mruby/cは、mrubyのコンパイラを使用するなどの高い互換性を有しています。
- mrubyでは、3.0から3.1のバージョンアップにおいて、後方互換性を有さない一部変更が行われました。
- そのため、mruby/cではmrubyの最新バージョンに整合するため、3.0をスキップして3.1をリリースいたしました。
- なお、mruby 3.0を使用する方に向けて、GitHubにmruby/c 3.0のブランチを用意しています。
https://github.com/mrubyc/mrubyc/tree/mrubyc3
その他のトピック
- GitHubリポジトリで行われている自動テストを、ローカル環境でも実行できます。テストの方法については、「How to run tests?」にまとめられています。
- mruby/c 3.1 で実装されているクラス・ライブラリの一覧を「クラス・ライブラリ一覧」に示しています。
ダウンロード
https://github.com/mrubyc/mrubyc/releases/tag/release3.1
mruby/c 3.1のリリースにおいて、バグフィックスと改良に取り組んでいただいた全てのコントリビュータに感謝します。
mruby/cについて
mruby/cはRubyの特徴を引き継ぎつつ、プログラム実行時に必要なメモリ消費量が従来のmruby(組込み向け軽量Ruby)より少ないソフトウェアの開発言語です。小さなワンチップマイコンでも動作するように開発しており、センサーネットワークやウェアラブルデバイスなどの小型端末向けソフトウェア開発に適しています。mruby/cは、しまねソフト研究開発センターと国立大学法人九州工業大学(田中和明准教授)で共同研究開発を行っています。
詳細はこちらのページをご覧ください。
お問い合わせ先
しまねソフト研究開発センター
Phone:0852-61-2225
Email:itoc@s-itoc.jp
【参考】ベンチマーク結果
▼実行速度の比較
コンパイル | CFLAGS=”-O2 - DNDEBUG” make |
ターゲット | Raspberry Pi 2 |
計測方法 |
プログラムを5回実行してuserタイムの上位3位を採用 |
Ver2.0: | mrbc2.1 & sample_c/mrubyc にて実行 |
Ver3.1: | mrbc3.1 & sample_c/sample_no_scheduler にて実行 |
- 実行速度の比較結果は、以下のとおり。
ハノイ hanoi(8)×200 | 速度 | ||||||
Ver | 1回目 | 2回目 | 3回目 | avg | 3*stdev | % | n倍速 |
2.0 | 9.381 | 9.379 | 9.421 | 9.394 | 0.071 | (基準値) | |
3.1 | 5.842 | 5.919 | 5.893 | 5.893 | 0.132 | -37.27% | 1.59 |
フィボナッチ 30×10 | 速度 | ||||||
Ver | 1回目 | 2回目 | 3回目 | avg | 3*stdev | % | n倍速 |
2.0 | 49.770 | 49.768 | 49.765 | 49.768 | 0.008 | (基準値) | |
3.1 | 31.208 | 31.214 | 31.215 | 31.212 | 0.011 | -37.28% | 1.59 |
自然対数の底 eの収束速度 ×10 | 速度 | ||||||
Ver | 1回目 | 2回目 | 3回目 | avg | 3*stdev | % | n倍速 |
2.0 | 27.875 | 28.078 | 27.869 | 27.941 | 0.357 | (基準値) | |
3.1 | 19.181 | 19.038 | 19.179 | 19.133 | 0.246 | -31.52% | 1.46 |
マージソート ×1000 | 速度 | ||||||
Ver | 1回目 | 2回目 | 3回目 | avg | 3*stdev | % | n倍速 |
2.0 | 39.691 | 39.667 | 39.949 | 39.769 | 0.469 | (基準値) | |
3.1 | 22.251 | 22.254 | 26.266 | 22.257 | 0.024 | -44.03% | 1.79 |
▼メモリ使用率の比較(PSoC5LP Release -02)| 単位:byte
Ver | RAM | ROM(Flash) |
mruby/c 2.0 | 12,209 | 61,952 |
mruby/c 3.1 | 5,385 | 74,960 |