longjmp() vs return
さっさと macro を実装し終えないといかんけど、脱線がやめられないとめられない。
Pattern match で mismatch が起きたときの処理だけど、
- 特定の値を返して return しまくる
- longjmp
の二つがある。前者だと戻り値の判定が積もる。後者だと setjmp() が重い。ちょっと benchmark をとってみた。N は loop 回数、M は再帰の深さ。本当は match する rule を見つけるまでの数もつけた方がいいけどめんどいので省略。
return の方が余裕で早い。再帰の深さが 9 超えた辺りで longjmp() の方が早くなる。しかし…変更するのだるいなあ。後回し。
それにしても何か RISC machine 欲しいなあ。しかしこういうプチ実験と file server ぐらいしか使わんのに買うのも勿体ないし。
#include <stdio.h> #include <stdlib.h> #include <setjmp.h> int N, M; int rec_f(int m); int (*volatile rec)() = rec_f; #if JMP jmp_buf buf; #endif int rec_f (int m) { #if JMP if (m) rec (m - 1); longjmp (buf, 1); #else if (m) { if (!rec (m - 1)) return 0; return 1; } return 0; #endif } int main (int argc, char *argv[]) { if (argc < 2) return 2; N = atoi (argv[1]); M = atoi (argv[2]); #if JMP volatile int i; i = N; if (setjmp (buf)) { if (--i <= 0) return 0; } rec (M); return 1; #else /* JMP */ int i; for (i = N; i--; ) rec (M); return 0; #endif }