MyNixOS website logo
Description

Catch errors thrown from pure computations using primops.

Takes an error-throwing expression and puts it back in the Maybe it belongs in, but with primops.

#Prim-Spoon

Build Status

This is a microproject for the sole purpose of having a high-performance version of teaspoon from Control.Spoon, using primops. While it is unsafe, it is as safe as catch# and seq# from GHC.Prim. (I'd look into how safe those are, but they're hidden in GHC's source and that really seems like overkill.)

Current benchmarks suggest that primspoon takes about 3x as long as a function call on non-error throwing values and about 5x as long to catch an error and return Nothing. This is an improvment over teaspoon, which takes about 4x as long as a function call on a non-error value and about 21x to catch an error.

Why bother? Three reasons:

  1. This is my first experience with digging into primops in Haskell for performance, and it was a good exercise.
  2. I had begun to roll my own solution before I found Control.Spoon and wanted to benchmark several different solutions (for example, makeStableName).
  3. I was curious how unsafePerformIO affects performance. It turns out that it takes longer than I expected, but it makes some sense as it's not the best thing to spend time optimizing.
Metadata

Version

0.1.0

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows