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回数を測て記録に残す事