lud

lud

Does adding a dummy guard `when true` affect performance

In order to only have one branch of code in a macro that defines functions with support for guards, I would like to always have a guard.

So I want to define the generated functions as def myfun(arg1,arg2) when true do when no guard is given.

I suspect that the compiler will get rid of it and that it will not impact performance, but I am not sure how to verify that.

Thank you.

Marked As Solved

al2o3cr

al2o3cr

You can use the :S option to @compile to cause Elixir to dump a text representation of the generated bytecode.

For this module (in foo.ex):

defmodule Foo do
  @compile :S

  def without_guard(x) do
    x + 1
  end

  def with_guard(x) when true do
    x + 1
  end
end

Compiling it with elixir foo.ex produces a CompileError - that’s expected, because the @compile :S has caused the compiler to stop midway. The relevant bit of the result in foo.ex.S:

{function, with_guard, 1, 11}.
  {label,10}.
    {line,[{location,"foo.ex",8}]}.
    {func_info,{atom,'Elixir.Foo'},{atom,with_guard},1}.
  {label,11}.
    {line,[{location,"foo.ex",9}]}.
    {gc_bif,'+',{f,0},1,[{x,0},{integer,1}],{x,0}}.
    return.


{function, without_guard, 1, 13}.
  {label,12}.
    {line,[{location,"foo.ex",4}]}.
    {func_info,{atom,'Elixir.Foo'},{atom,without_guard},1}.
  {label,13}.
    {line,[{location,"foo.ex",5}]}.
    {gc_bif,'+',{f,0},1,[{x,0},{integer,1}],{x,0}}.
    return.

Other than labels and line numbers, with_guard and without_guard produce identical bytecode.

20
Post #2

Also Liked

harrisi

harrisi

I’ll also add that, in my experience, adding guards tends to increase performance, not decrease. In some cases it can be a significant speed increase.

Always crucial to profile actual code, though!

Last Post!

lud

lud

Ah yes I forgot about the S thing. I remember there was also an E format. I should take some time to learn about those.

Thank you :slight_smile:

Where Next?

Popular in Questions Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New

Other popular topics Top

Qqwy
Update: How to use the Blogs & Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3271 130286 1222
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 54006 488
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New

We're in Beta

About us Mission Statement