<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 2/26/21 3:53 PM, Dan Gudmundsson
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CANX4uuM5yXh8EQ9UxQtxak4QgTE-7fh3=481VMiBTDsO3rMenQ@mail.gmail.com">
      <div dir="ltr">Interesting, and times do you get for 500 ets
        lookup on that data?</div>
    </blockquote>
    <p>Oh, I really should have tested that as well:</p>
    <p>timer:tc(fun () -> lists:map(fun(K) -> ets:lookup(t, K)
      end, Keys) end).</p>
    <p>* using lookups: [set, {keypos, 2}]:               3148 us<br>
      * using lookup: [ordered_set, {keypos, 2}]:  3423 us</p>
    <p>I have repeated the select/pattern runs to have comparable
      results:</p>
    <p>* using pattern, [ordered_set, {keypos, 2}]: 3173 us<br>
      * using pattern, [set, {keypos, 2}]:               8091 us</p>
    <p>Note that there was quite a high jitter on the measurements so I
      have compute the mean value of 3 measurements each.</p>
    <p>So lookups and pattern/ordered_set were too close to really come
      to a winner here. I had the impression that the variance was
      slightly higher with lookup, but digging into this would require a
      better measurement setup than what I have been using.</p>
    <p><br>
    </p>
    <blockquote type="cite"
cite="mid:CANX4uuM5yXh8EQ9UxQtxak4QgTE-7fh3=481VMiBTDsO3rMenQ@mail.gmail.com"> <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Fri, Feb 26, 2021 at 3:12
          PM Jacob <<a href="mailto:jacob01@gmx.net"
            moz-do-not-send="true">jacob01@gmx.net</a>> wrote:<br>
        </div>
        <blockquote class="gmail_quote">Hi,<br>
          <br>
          assuming that the match spec compiler does clever things with
          patterns,<br>
          I'd use select with the following<br>
          <br>
             MatchExpression = [ {{'_', K, '_'}, [], ['$_']} || K <-
          Keys ]<br>
          <br>
          If did some quick measurements with plain ETS, timer:tc and
          500 keys out<br>
          of 1000000 table entries and got:<br>
          <br>
             * using pattern, [ordered_set]: 4532605 us<br>
             * using pattern, [set]              :  4645525 us<br>
             * using pattern, [ordered_set, {keypos, 2}]: 3826 us (!!!)<br>
             * using pattern, [set, {keypos, 2}]: 5714 us (!!!)<br>
          <br>
             * using guards, [ordered_set]: 12542928 us<br>
             * using guards, [set]:               12310452 us<br>
             * using guards, [ordered_set, {keypos, 2}]: 12365477 us<br>
             * using guards, [set, {keypos, 2}]: 12277839 us<br>
          <br>
          I have initialised the DB with [ ets:insert(t, {N, N,<br>
          integer_to_list(N)}) || N <- lists:seq(1, 1000000) ].<br>
          <br>
          I don't know though, how this will translate to Mnesia, but
          I'd give<br>
          select with pattern on the primary key a try.<br>
          <br>
          /Jacob<br>
          <br>
          <br>
          On 2/26/21 11:03 AM, Vance Shipley wrote:<br>
          > If I need to lookup a list of keys which is the better
          approach? Why?<br>
          ><br>
          > Fselect = fun(Keys) -><br>
          >         MatchHead = {'_', '$1', '$2'},<br>
          >         F = fun(Key) -><br>
          >                 {'=:=', '$1', Key}<br>
          >         end,<br>
          >         MatchConditions = [list_to_tuple(['or' |
          lists:map(F, Keys)]),<br>
          >         MatchBody = ['$_'],<br>
          >         MatchFunction = {MatchHead, MatchConditions,
          MatchBody},<br>
          >         MatchExpression = [MatchFunction],<br>
          >         mnesia:select(Table, MatchExpression)<br>
          > end,<br>
          > mnesia:transaction(Fselect, [Keys]).<br>
          ><br>
          > Fread = fun F([Key | T], Acc) -><br>
          >                 [R] = mnesia:read(Table, Key),<br>
          >                 F(T, [R | Acc]);<br>
          >         F([], Acc) -><br>
          >                 lists:reverse(Acc)<br>
          > end,<br>
          > mnesia:transaction(Fread, [Keys. []]).<br>
          ><br>
          ><br>
          > --<br>
          >      -Vance<br>
        </blockquote>
      </div>
    </blockquote>
  </body>
</html>