<div dir="ltr">Hi,<div><br></div><div>My guess the reason is that the <font face="monospace">iolist_to_binary(Value0)</font> call compiles into a <font face="monospace">call_ext</font>, while the <font face="monospace">is_binary(Value0)</font> to a <font face="monospace">test</font> assembly instruction. This means all live X registers have to be saved to the heap (and restored later) in the first case. Inlining the <font face="monospace">is_binary</font> check can save you that (and a somewhat expensive external function call) when <font face="monospace">Value0</font> 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 <font face="monospace">erlc -S</font> and compare the generated assembly code with and without the if statement?</div><div><br></div><div>Cheers,</div><div>Daniel</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 27 Dec 2019 at 11:07, Loïc Hoguin <<a href="mailto:essen@ninenines.eu">essen@ninenines.eu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
I seem to be getting a small but noticeable performance improvement when <br>
I change the following:<br>
<br>
Value = iolist_to_binary(Value0)<br>
<br>
Into the following:<br>
<br>
Value = if<br>
     is_binary(Value0) -> Value0;<br>
     true -> iolist_to_binary(Value0)<br>
end<br>
<br>
At least when the input data is mostly binaries. Anyone else seeing this?<br>
<br>
The only difference between is_binary and iolist_to_binary seems to be <br>
that is_binary calls is_binary/binary_bitsize on the same if expression <br>
while iolist_to_binary has two if statements.<br>
<br>
What gives?<br>
<br>
Cheers,<br>
<br>
-- <br>
Loïc Hoguin<br>
<a href="https://ninenines.eu" rel="noreferrer" target="_blank">https://ninenines.eu</a><br>
</blockquote></div>