[erlang-questions] BEAM micro-optimization: term comparison (> 0) versus pattern-matching

Mikael Pettersson mikpelinux@REDACTED
Sat Apr 15 20:13:22 CEST 2017


Suppose a frequently called function returns a positive integer (always a fixnum)
and a boolean "success" or "failure" indicator (even in the failure case the return
value is significant and will be used).  Which is better from a performance
perspective:

1. Tag the return value, {success, X} or {failure, Y}, and have callers pattern-match
   on that

or,

2. Indicate failure by negating Y, and have callers match on

      X when X > 0 -> success case;
      MinusY -> failure case % MinusY =< 0 is implicit

Option 2 avoids the consing overheads of option 1, but I'm worried that the X > 0
guard may be less optimized than a plain structural pattern-match.  The last time
I checked, term-comparisons would check inline for identity, and otherwise call
the general cmp() function which would then do a lot of type-casing.

In my pure Erlang code I'm using option 1, but I'm reimplementing the function
as a NIF, and would like to avoid the consing overheads is that's indeed better.


/Mikael



More information about the erlang-questions mailing list