2012年06月15日

mrubyのサイズが激減した件 2012/06

mrubyのサイズが激減した件 2012/06
* 1ヶ月でmrubyのコードサイズが激減した
* ARMのThumb2コードはもっとスゴかった !! 
* 機能カットで遂に200kbyteを切る !!!

* 1ヶ月でmrubyのコードサイズが激減した
前回、mrubyをコンパイルしてみた 2012/05 
http://avr.paslog.jp/article/2462064.html
で、初めてmrubyをコンパイルした時のmrubyの実行サイズはMinGW上で
Makefile内の最適化オプションをすべて「-Os」にして,stripかけて(注3)
720kbyte(717,200)くらいだった。

それから1ヶ月。精力的な改良が行われているようで、
作者の方の談によるとソースコードが1万行以上減ったらしい。
という話を聞きつけて今日の時点でもう一度コンパイルしてみた。

どゎ〜〜〜〜〜〜〜〜〜〜〜〜っ!!

サ、サイズが半分以下になったのだった。

MinGWは事前に最新バージョン化しておいた。
$ mingw-get update
$ ming-get upgrade
今回は最初MinGW上でなぜかコンパイルできなかったので、(注1) Linux(Ubuntu)上でもコンパイルしてみた。結果はどちらも同等のコードサイズであることが分った。 arm-none-eabi-gccの「Thumb2」コードだとさらに10%程度減少して300kbyte程度になる と思われる。 「さらにコード効率の良い」RX62Nなら300kbyteを下まわる可能性もある。 以下、取得したリビジョンはhg-git(mercurial-hg)したTortoiseHG(mercurial)上のリビジョン。 (rev.NNNの部分はmercurial用。 gitのコードバージョンは"git hush"で特定できる)
(x86) lib/libmryby.aのコードサイズの変遷 , gcc最適化(-Os)
コミット日付(hg rev.)SizeTool versiongit hush(先頭から)
2012/06/21(rev.918)319 kbyteMinGW gcc v4.7.0, bison v2.4.22109556188
2012/06/14(rev.833)318 kbyteMinGW gcc v4.7.0, bison v2.4.2d118724872
2012/06/14(rev.833)344 kbyteubuntu gcc v4.6.3, bison v2.5d118724872
2012/05/12(rev.316)701 kbyteMinGW gcc v4.7.0, bison v2.4.2e274382aca7
これからは、上の表の様に「lib/libmruby.a」のコードサイズを比較していくことにする。 超組み込みマイコンの場合「mruby.exe」などの実行ファイルを作るわけではないのと、 各種「*.exe」と大きさがほぼ同じだからだ。 最近のmrubyは、最適化オプション「-Os等」がトップレベルのMakefileで選択できるように、 改良されていて非常に助かりました。m(__)m * ARMのThumb2コードはもっとスゴかった !! 最近、超組み込みマイコンで流行りの、ARM Cortex-M3マイコン用の 無料のgccクロスコンパイラ(YAGARTO)、「arm-none-eabi-gcc.exe」でコンパイルしてみた。 コードサイズの表示は、x86用なら
$ size -t lib/libmruby.a
で、Totalのところを読む。(注2) ARMならsizeのかわりに、「arm-none-eabi-size」を使う。
lib/libmryby.aのコードサイズの比較 , gcc最適化(-Os)
CPUコミット日付(hg rev.)SizeTool versiongit hush
ARM Cortex-M3
Thumb2
2012/06/21(rev.918)226 kbyteYAGARTO gcc v4.7.0, bison v2.4.22109556188
x862012/06/21(rev.918)319 kbyteMinGW gcc v4.7.0, bison v2.4.22109556188
ぬぁにぃ〜〜〜〜〜〜〜〜〜〜〜っ!!! 当初のx86に比べて10%程度コードサイズが減るという予測だったものの、 実際にやってみると30%、なんと「約100kbyte」もコードサイズが縮んだのだった。 (^^)/ (^^)/ ちなみに、RX62N系だともっと小さくなって、200kbyte以下になる可能性もある。スゴ *必要なRAM容量 まだ、詳細は不明なものの Rubyで書かれた内部ライブラリを仮想マシンコードに変換した物が、 mrblib/mrblib.ctmpファイル。このファイルの仮想マシンコード部分約17kbyteが 初期化時にヒープに読み込まれるのでこの時点で最低でも17kbyte。 これに、 (1)アプリケーションを仮想マシンに変換した分。 (2)アプリケーション内で確保されるRAM。 (3)仮想マシンを動作させるためのシステム側のスタックやヒープ。 (4)その他もろもろ。 を加えてトータルでさていくつ? (謎 SRAM 32kbyteじゃ無理な気がするので、SRAM 64kbyte〜128kbyteでどうかなぁ。 * 機能カットで遂に200kbyteを切る !!! 以下の記事や、 mrubyのライブラリ構成とは?― まつもとゆきひろ氏インタビュー第2弾 以下の方のブログから、 コンデンサの隣からひとこと mrubyのメモリ使用量 http://d.hatena.ne.jp/machaut/20120624/1340547112 "include/mrbconf.h"で機能の有無を選択できる事を知りました。 中を見てみると、 デフォルト状態では、正規表現ライブラリが除外されているだけで、 残りは全て有効状態だったので、全て無効にしてみた。 すると、さらに約30kbyte減り遂に196kbyteになりました。 (上記のARM Cortex-M3でコンパイルしたリビジョン, hg:rev.918) ただし、2012/06/27時点で取得したリビジョン(hg:rev.970)では10kbyteほどコード量が 増えていた。 従ってコード量については、数十キロバイトオーダで日々変動があると思われる。 一旦大きくコード量が減ったものの、エラー処理やバグ対応、機能追加などで 今後、数年かかってゆっくりとした増加傾向になるような気がする。 機能選択「include/mrbconf.h」について: 2012.06.26 23:17 (hg:rev970) (git hush: 2c7b9faba6ebd38d) (注4) このファイル(このリビジョン)についていえば、 「#undef MRB_USE_FLOAT」 があるために、コメント通りには機能しなかったり、 (コンパイルオプションに指定しても#undefされてしまう) 明示的に禁止定義をしない限り、全てデフォルトで有効だったり(regexpを除く) 上の「MRB_USE_FLOAT」だけロジックが逆だったりと、 ハマリがちなので、注意した方が良い、 そのうち修正が入ると思う。 (#undef をやめて、ロジックもDISABLE方式に統一した方が良い) (注1)MinGWのコンソールではなく、MSーDOSのプロンプトでmakeしたのが原因だった風。 orz (注2)libmruby.aのファイルサイズ自体は、アーカイバで圧縮されているので"ファイルサイズ"を比較する意味は薄い。 (注3)実際のコードサイズを見るならstripをかける必要はなくて、sizeコマンドで見た方が良い。 (注4)日時は日本時間(Local time)表現


posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | mruby | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。