When developing a fast compiler for the Sun-4 series we have encountered rather strange behavior of the Sun kernel. The problem is that when you have lots of nested procedure calls, (as is often the case in compilers and parsers) the registers fill up which causes a kernel trap. The kernel will then write out some of the registers to memory to make room for another window. When you return from the nested procedure call, just the reverse happens: yet another kernel trap so the kernel can load the register from memory. Unfortunately the kernel only saves or loads a single window (= 16 register) on each trap. This means that when you call a procedure recursively it causes a kernel trap on almost every invocation (except for the first few). To illustrate this consider the following little program: --------------- little program ------------- f(i) /* calls itself i times */ int i; { if (i) f(i-1); } main(argc, argv) int argc; char *argv[]; { i = atoi(argv[1]); /* # loops */ j = atoi(argv[2]); /* depth */ while (i--) f(j); } ------------ end of little program ----------- The performance decreases abruptly when the depth (j) becomes larger than 5. On a SPARC station we got the following results: depth run time (in seconds) 1 0.5 2 0.8 3 1.0 4 1.4 <- from here on it's +6 seconds for each 5 7.6 step deeper. 6 13.9 7 19.9 8 26.3 9 32.9 Things would be a lot better when instead of just 1, the kernel would save or restore 4 windows (= 64 registers = 50% on our SPARC stations). -Raymond.