Gmane
From: Bruno Haible <bruno <at> clisp.org>
Subject: Re: setjmp
Newsgroups: gmane.lisp.clisp.devel
Date: 2008-05-25 10:38:10 GMT (1 year, 5 weeks, 4 days, 14 hours and 33 minutes ago)
Sam wrote:
> the output is the same with either setjmp/longjmp or _setjmp/_longjmp
> 
> no
> setjmp=0
> yes
> yes
> setjmp=42
> yes

That was with glibc, right? Look on different platforms.

Attached you find two test programs, one for the signal mask behaviour
and one for the time that setjmp takes. (I don't benchmark longjmp, since
in clisp setjmp gets called much more often than longjmp. In the interpreter,
these jmp_bufs are filled only _in_case_ the user, when debugging, would
want to leave the current frame.)

Detailed results:
==============================================================================
On Linux:

$ gcc setjmp-signal.c -Wall && ./a.out 
setjmp is fast
$ gcc setjmp-signal.c -Wall -DUSE__SETJMP && ./a.out 
setjmp is fast
$ gcc setjmp-signal.c -Wall -DUSE_SIGSETJMP_0 && ./a.out 
setjmp is fast

$ gcc setjmp-signal.c -Wall -D_BSD_SOURCE && ./a.out 
setjmp saves signal mask
$ gcc setjmp-signal.c -Wall -D_BSD_SOURCE -DUSE__SETJMP && ./a.out 
setjmp-signal.c: Dans la fonction « main »:
setjmp-signal.c:44: Warnung: implicit declaration of function `_setjmp'
setjmp is fast
$ gcc setjmp-signal.c -Wall -D_BSD_SOURCE -DUSE_SIGSETJMP_0 && ./a.out 
setjmp is fast

$ gcc timesetjmp.c && ./a.out 100 && time ./a.out 1000000

real    0m0.035s
user    0m0.033s
sys     0m0.002s
$ gcc timesetjmp.c -DUSE__SETJMP && ./a.out 100 && time ./a.out 1000000

real    0m0.035s
user    0m0.031s
sys     0m0.003s
$ gcc timesetjmp.c -DUSE_SIGSETJMP_0 && ./a.out 100 && time ./a.out 1000000

real    0m0.080s
user    0m0.078s
sys     0m0.002s
$ gcc timesetjmp.c -D_BSD_SOURCE && ./a.out 100 && time ./a.out 1000000

real    0m0.884s
user    0m0.495s
sys     0m0.385s
$ gcc timesetjmp.c -D_BSD_SOURCE -DUSE__SETJMP && ./a.out 100 && time ./a.out 1000000

real    0m0.035s
user    0m0.033s
sys     0m0.001s
$ gcc timesetjmp.c -D_BSD_SOURCE -DUSE_SIGSETJMP_0 && ./a.out 100 && time ./a.out 1000000

real    0m0.079s
user    0m0.078s
sys     0m0.001s

On FreeBSD 6.2:

$ gcc setjmp-signal.c -Wall && ./a.out 
setjmp saves signal mask
$ gcc setjmp-signal.c -Wall -DUSE__SETJMP && ./a.out 
setjmp is fast
$ gcc setjmp-signal.c -Wall -DUSE_SIGSETJMP_0 && ./a.out 
setjmp is fast

$ gcc timesetjmp.c && ./a.out 100 && time ./a.out 1000000

real    0m0.559s
user    0m0.166s
sys     0m0.392s
$ gcc timesetjmp.c -DUSE__SETJMP && ./a.out 100 && time ./a.out 1000000

real    0m0.017s
user    0m0.016s
sys     0m0.001s
$ gcc timesetjmp.c -DUSE_SIGSETJMP_0 && ./a.out 100 && time ./a.out 1000000

real    0m0.019s
user    0m0.018s
sys     0m0.001s

On OpenBSD 4.0:

$ gcc setjmp-signal.c -Wall && ./a.out 
setjmp saves signal mask
$ gcc setjmp-signal.c -Wall -DUSE__SETJMP && ./a.out 
setjmp is fast
$ gcc setjmp-signal.c -Wall -DUSE_SIGSETJMP_0 && ./a.out 
setjmp is fast

$ gcc timesetjmp.c && ./a.out 100 && time ./a.out 1000000

real    0m0.386s
user    0m0.086s
sys     0m0.289s
$ gcc -DUSE__SETJMP timesetjmp.c && ./a.out 100 && time ./a.out 1000000

real    0m0.016s
user    0m0.016s
sys     0m0.000s
$ gcc -DUSE_SIGSETJMP_0 timesetjmp.c && ./a.out 100 && time ./a.out 1000000

real    0m0.019s
user    0m0.016s
sys     0m0.000s

On HP-UX 11:

$ cc setjmp-signal.c && ./a.out
setjmp saves signal mask
$ cc setjmp-signal.c -DUSE__SETJMP && ./a.out 
setjmp is fast
$ cc setjmp-signal.c -DUSE_SIGSETJMP_0 && ./a.out
setjmp is fast

$ cc timesetjmp.c && ./a.out 100 && time ./a.out 1000000

real    0m1.882s
user    0m0.850s
sys     0m1.030s
$ cc timesetjmp.c -DUSE__SETJMP && ./a.out 100 && time ./a.out 1000000

real    0m0.133s
user    0m0.130s
sys     0m0.000s
$ cc timesetjmp.c -DUSE_SIGSETJMP_0 && ./a.out 100 && time ./a.out 1000000

real    0m1.985s
user    0m0.840s
sys     0m1.150s
==============================================================================

Results in tabular form:

                          setjmp           _setjmp         sigsetjmp(.,0)
                      saves mask/time   saves mask/time   saves mask/time

Linux                     N  0.035          N  0.035          N  0.080
Linux -D_BSD_SOURCE       Y  0.88           N  0.035          N  0.079
FreeBSD 6.2               Y  0.56           N  0.017          N  0.019
OpenBSD 4.0               Y  0.39           N  0.016          N  0.019
HP-UX 11                  Y  1.88           N  0.13           N  1.98

Conclusions:
  - The "time" is the best in the second column. I.e. sigsetjmp(.,0) never
    should be used: it is always slower than _setjmp.
  - HP-UX wastes time in sigsetjmp(.,0) for no good reason.
  - Among the first two columns, "N" correlates with good time, and "Y"
    correlates with bad time.
  - So _setjmp should be used when available and declared. The
      !defined(UNIX_LINUX) && !defined(UNIX_GNU) && !defined(UNIX_BEOS)
    could be dropped; I don't think it makes a difference.
  - Not sure what the !defined(UNIX_CYGWIN32) was about.

In the end, I don't think we need the autoconf test.

Bruno
Attachment (setjmp-signal.c): text/x-csrc, 1206 bytes
Attachment (timesetjmp.c): text/x-csrc, 400 bytes
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
clisp-devel mailing list
clisp-devel <at> lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/clisp-devel