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
}