<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <p>I don't think Ruel was asking about differences between maps and
      records, only what datatype is optimal for map's keys?</p>
    <p>I was hoping someone from the OTP team will take on this
      question, but from what I understand the key is always hashed
      using some C functions. So, the shorter is the key the faster will
      be the hashing, but the difference will be so small, that only
      noticeable on really big data structures (like long lists/strings,
      binaries or deep data structures, like dicts, where it has to be
      traversed, and by long I mean a few dozens of bytes).</p>
    <p>Grzegorz<br>
    </p>
    <br>
    <div class="moz-cite-prefix">On 01/10/2016 19:24, Jesper Louis
      Andersen wrote:<br>
    </div>
    <blockquote
cite="mid:CAGrdgiX0sGgEZiBAtYhbXHR-d_o-rW9_KYWj+ie5cv5YM_q5HA@mail.gmail.com"
      type="cite">
      <div dir="ltr">Hi,
        <div><br>
        </div>
        <div>You have to define optimal. Do you want efficient lookup or
          do you want to save space? For static keys, using atoms has
          the advantage of being fast to compare and rather small (1
          machine word). For small maps, lookup speeds are so quick I
          don't think it really matters too much if a record is
          marginally faster. I'd go for readability over efficiency in
          almost all situations.</div>
        <div><br>
        </div>
        <div>As for the record vs maps discussion: I tend to use an
          algebraic datatype instead, so I can avoid representing state
          which is not valid. In some circumstances, a map is fit for
          the representation. One weakness of a record is that if we
          define</div>
        <div><br>
        </div>
        <div>-record(state, { name, socket }).</div>
        <div><br>
        </div>
        <div>then we need to have #state { socket = undefined } at some
          point if we don't have a valid socket. With a map, we can
          simply initialize to the state #{ name => Name } and then
          when the socket is opened later, we can do State#{ socket
          => Sock } in the code and extend the state with a socket
          key. In a language such as OCaml, we could represent it as the
          type</div>
        <div><br>
        </div>
        <div>-type state() :: {unconnected, name()} | {connected,
          name(), socket()}.</div>
        <div><br>
        </div>
        <div>And I've done this in Erlang as well. It depends on the
          complexity of the representation. As for the goal: the goal is
          to build a state which is very hard to accidentally pattern
          match wrongly on in the code base. If your state has no
          socket, a match such as</div>
        <div><br>
        </div>
        <div>barney(#{ socket := Sock }) -> ...</div>
        <div><br>
        </div>
        <div>cannot match, even by accident. In turn, it forces the code
          to fail on the match itself, not later on when you try to do
          something with an undefined socket.</div>
        <div><br>
        </div>
      </div>
      <div class="gmail_extra"><br>
        <div class="gmail_quote">On Sat, Oct 1, 2016 at 12:37 PM,
          Pagayon, Ruel <span dir="ltr"><<a moz-do-not-send="true"
              href="mailto:ruel@ruel.me" target="_blank">ruel@ruel.me</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div dir="ltr">Hi everyone,
              <div><br>
              </div>
              <div>I'm just wondering (assuming the keys of my maps in
                my application is not dynamically generated):</div>
              <div><br>
              </div>
              <div>1. What is the most optimal key type for maps?<br>
              </div>
              <div>2. If there is little to no effect in performance (or
                resources in general), as a convention, which is the
                best to use?</div>
              <div><br>
              </div>
              <div>Thank you in advance for your responses.</div>
              <div><br>
              </div>
              <div>Cheers,</div>
              <div>Ruel</div>
            </div>
            <br>
            ______________________________<wbr>_________________<br>
            erlang-questions mailing list<br>
            <a moz-do-not-send="true"
              href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
            <a moz-do-not-send="true"
              href="http://erlang.org/mailman/listinfo/erlang-questions"
              rel="noreferrer" target="_blank">http://erlang.org/mailman/<wbr>listinfo/erlang-questions</a><br>
            <br>
          </blockquote>
        </div>
        <br>
        <br clear="all">
        <div><br>
        </div>
        -- <br>
        <div class="gmail_signature" data-smartmail="gmail_signature">J.</div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
erlang-questions mailing list
<a class="moz-txt-link-abbreviated" href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a>
<a class="moz-txt-link-freetext" href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>