branches suppress_arglist_wrapper - seagull-kamome/Idris2 GitHub Wiki

Motivation

  • すべての関数に対して _arglistってサフィックスのついたラッパが生成されるけど、 これって要は全部同じものだよね。ディスパッチャが一つあれば、こいつら全部いらないよね。
  • apply_closureとtrampolineの実装が汚くて気持ち悪い。
  • closureとarglist、別々にする意味ないやん?どうせ大して再利用できるわけでもないし。 んじゃまとめちゃえばオーバーヘッド削減できるよね。
  • クロージャ作ってそのすぐ後でtrampolineするコード吐くけど、これって最初のクロージャ 作る必要ないよね。

やった事

上に書いたとおり。

ディスパッチャが16個までの引数しか受け付けない制限があるけど、これってあっという間に引っかかるよね

  • 試しに32個まで増やして見たらディスパッチャのコードサイズが太って嫌な事になった。
  • そもそもそんなに引数多いとスタック食いつぶす。クロージャの場合はヒープに引数リストがあるのに、 それをスタックにコピーするのはただのオーバーヘッド。
  • なので、16個を超える引数は配列のまま渡すようにした。
  • クロージャを作らない場合には、あまり大きい配列をスタックに作りたくないので、ヒープにarglistを作る。

そもそも、Cの引数の数に制限があってC89で31個、C99でも127個まで。

現状の問題

実験ブランチ切り換えるの忘れてて、全部ここに混ざってもうた。 頑張って切り離し中。

計測

TODO: valgrindでallocation回数を測て記録に残す事