Conditional iolist_to_binary?
Loïc Hoguin
essen@REDACTED
Sat Dec 28 11:16:09 CET 2019
That was it, thanks. And more importantly thanks for the explanations!
Interesting...
On 27/12/2019 22:54, Dániel Szoboszlay wrote:
> Hi,
>
> My guess the reason is that the iolist_to_binary(Value0) call compiles
> into a call_ext, while the is_binary(Value0) to a test assembly
> instruction. This means all live X registers have to be saved to the
> heap (and restored later) in the first case. Inlining the is_binary
> check can save you that (and a somewhat expensive external function
> call) when Value0 is already a binary. But how much a difference this is
> depends on how many live X registers you have at that point. Maybe try
> compiling the actual module with erlc -S and compare the generated
> assembly code with and without the if statement?
>
> Cheers,
> Daniel
>
> On Fri, 27 Dec 2019 at 11:07, Loïc Hoguin <essen@REDACTED
> <mailto:essen@REDACTED>> wrote:
>
> Hello,
>
> I seem to be getting a small but noticeable performance improvement
> when
> I change the following:
>
> Value = iolist_to_binary(Value0)
>
> Into the following:
>
> Value = if
> is_binary(Value0) -> Value0;
> true -> iolist_to_binary(Value0)
> end
>
> At least when the input data is mostly binaries. Anyone else seeing
> this?
>
> The only difference between is_binary and iolist_to_binary seems to be
> that is_binary calls is_binary/binary_bitsize on the same if expression
> while iolist_to_binary has two if statements.
>
> What gives?
>
> Cheers,
>
> --
> Loïc Hoguin
> https://ninenines.eu
>
--
Loïc Hoguin
https://ninenines.eu
More information about the erlang-questions
mailing list