<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Hi Vitaly,<br>
    <br>
    I have just measured where the version that includes the patch
    spends most time:<br>
    It turns out that ~90% of the time is used for checking
    dependencies. The remaining 10% <br>
    are spent constructing the dependency signature, performing the
    lookup, and adding<br>
    dependency signatures.<br>
    <br>
    Best,<br>
    Albert<br>
    <br>
    <br>
    <div class="moz-cite-prefix">On 01/09/2014 03:49 PM, Vitaly
      Davidovich wrote:<br>
    </div>
    <blockquote
cite="mid:CAHjP37EPFefOM10o67QDQ05HQ_BhDby-DsZDQe+vhHsXs2_f7A@mail.gmail.com"
      type="cite">
      <p dir="ltr">Hi Albert,</p>
      <p dir="ltr">Just a thought - since you don't care about order of
        dependencies (just uniqueness) wouldn't a hashing container be
        more optimal than binary search tree?</p>
      <p dir="ltr">Thanks</p>
      <p dir="ltr">Sent from my phone</p>
      <div class="gmail_quote">On Jan 9, 2014 9:30 AM, "Albert Noll"
        &lt;<a moz-do-not-send="true"
          href="mailto:albert.noll@oracle.com">albert.noll@oracle.com</a>&gt;
        wrote:<br type="attribution">
        <blockquote class="gmail_quote" style="margin:0 0 0
          .8ex;border-left:1px #ccc solid;padding-left:1ex">
          Hi all,<br>
          <br>
          could I get reviews for this patch?<br>
          <br>
          bug: <a moz-do-not-send="true"
            href="https://bugs.openjdk.java.net/browse/JDK-7194669"
            target="_blank">https://bugs.openjdk.java.net/browse/JDK-7194669</a><br>
          webrev: <a moz-do-not-send="true"
            href="http://cr.openjdk.java.net/%7Eanoll/7194669/webrev.00/"
            target="_blank">http://cr.openjdk.java.net/~anoll/7194669/webrev.00/</a><br>
          <br>
          Problem:<br>
          The dependency verification code in CodeCache::mark_for_deoptimization
          walks over all live nmethods in the code cache and checks all
          dependencies for each nmethod. This leads to checking the same
          dependency multiple times which can take a huge amount of
          time.<br>
          <br>
          Solution:<br>
          To avoid checking dependencies more than once, dependencies
          are abstracted by dependency signatures, which consider (i)
          the type of a dependency and (ii) the identity hashes of the
          arguments<br>
          of a dependency. For each dependency that will be checked, a
          dependency signature is generated<br>
          and that dependency signature is compared against a set of
          already checked dependency signatures.<br>
          If a dependency has already been checked, the check is
          skipped.<br>
          Dependency signatures of a specific type are stored in a
          binary tree to provide a fast lookup. I.e., each<br>
          dependency type has its own binary tree. The key to the tree
          is the identity hash of one argument. More<br>
          details about the data structure are described as comments in
          the code.<br>
          <br>
          Results:<br>
          An evaluation of the performance gain shows a 4.3x speedup of
          dependency checking. More concretely,<br>
          I used nashorn + octane on a 64-bit Linux Hotspot version. The
          dependency checking time of the<br>
          original version is 3888 seconds. The dependency checking time
          of the optimized version is 902 seconds.<br>
          <br>
          Passed jprt.<br>
          <br>
          <br>
          Many thanks in advance,<br>
          Albert<br>
        </blockquote>
      </div>
    </blockquote>
    <br>
  </body>
</html>