{"action":"created","comment":{"url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls/comments/44015080","id":44015080,"diff_hunk":"@@ -0,0 +1,439 @@\n+/*                     __                                               *\\\n+**     ________ ___   / /  ___      __ ____  Scala.js Benchmarks        **\n+**    / __/ __// _ | / /  / _ | __ / // __/  (c) 2013, Jonas Fonseca    **\n+**  __\\ \\/ /__/ __ |/ /__/ __ |/_// /_\\ \\                               **\n+** /____/\\___/_/ |_/____/_/ | |__/ /____/                               **\n+**                          |/____/                                     **\n+\\*                                                                      */\n+\n+// Copyright 2009 the V8 project authors. All rights reserved.\n+// Redistribution and use in source and binary forms, with or without\n+// modification, are permitted provided that the following conditions are\n+// met:\n+//\n+//     * Redistributions of source code must retain the above copyright\n+//       notice, this list of conditions and the following disclaimer.\n+//     * Redistributions in binary form must reproduce the above\n+//       copyright notice, this list of conditions and the following\n+//       disclaimer in the documentation and/or other materials provided\n+//       with the distribution.\n+//     * Neither the name of Google Inc. nor the names of its\n+//       contributors may be used to endorse or promote products derived\n+//       from this software without specific prior written permission.\n+//\n+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+//\n+// This benchmark is based on a JavaScript log processing module used\n+// by the V8 profiler to generate execution time profiles for runs of\n+// JavaScript applications, and it effectively measures how fast the\n+// JavaScript engine is at allocating nodes and reclaiming the memory\n+// used for old nodes. Because of the way splay trees work, the engine\n+// also has to deal with a lot of changes to the large tree object\n+// graph.\n+\n+// This is a Scala implementation of the Splay benchmark from:\n+// https://github.com/chromium/octane/blob/master/splay.js\n+\n+// Ported by Nicolas Stucki to Scala.js.\n+\n+package org.scalajs.benchmark.splay\n+\n+import scala.scalajs.js\n+import scala.util.Random\n+\n+object Splay extends org.scalajs.benchmark.Benchmark {\n+\n+  override def prefix: String = \"Splay\"\n+\n+  def run(): Unit = splayRun()\n+  override def setUp(): Unit = splaySetup()\n+  override def tearDown(): Unit = splayTearDown()\n+\n+  //// Configuration.\n+  private final val kSplayTreeSize = 8000\n+  private final val kSplayTreeModifications = 80\n+  private final val kSplayTreePayloadDepth = 5\n+\n+  private var splayTree: SplayTree[js.Dynamic] = null\n+  private var splaySampleTimeStart = 0L\n+\n+  private def generatePayloadTree(depth: Int, tag: String): js.Dynamic = {\n+    if (depth == 0) {\n+      js.Dynamic.literal(\n+        array = js.Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9),\n+        string = s\"String for key $tag in leaf node\"\n+      )\n+    } else {\n+      js.Dynamic.literal(\n+        left =  generatePayloadTree(depth - 1, tag),\n+        right = generatePayloadTree(depth - 1, tag)\n+      )\n+    }\n+  }\n+\n+  Random.setSeed(1L)\n+  private def generateKey(): Int = {\n+    // The benchmark framework guarantees that Math.random is\n+    // deterministic; see base.js.\n+    Random.nextInt()\n+  }\n+\n+  private var splaySamples: Int = 0\n+  private var splaySumOfSquaredPauses = 0L\n+\n+  def splayRMS(): Long =\n+    Math.round(Math.sqrt(splaySumOfSquaredPauses / splaySamples) * 10000)\n+\n+  private def splayUpdateStats(time: Long) = {\n+    val pause = time - splaySampleTimeStart\n+    splaySampleTimeStart = time\n+    splaySamples += 1\n+    splaySumOfSquaredPauses += pause * pause\n+  }\n+\n+  private def insertNewNode(): Int = {\n+    // Insert new node with a unique key.\n+    var key = 0\n+    do {\n+      key = generateKey()\n+    } while (splayTree.find(key) != null)\n+    val payload = generatePayloadTree(kSplayTreePayloadDepth, key.toString)\n+    splayTree.insert(key, payload)\n+    key\n+  }\n+\n+  private def splaySetup(): Unit = {\n+    splayTree = new SplayTree\n+    splaySampleTimeStart = System.nanoTime()\n+    for (i <- 0 until kSplayTreeSize) {\n+      insertNewNode()\n+      if ((i+1) % 20 == 19)\n+        splayUpdateStats(System.nanoTime())\n+    }\n+  }\n+\n+  private def splayTearDown(): Unit = {\n+    // Allow the garbage collector to reclaim the memory\n+    // used by the splay tree no matter how we exit the\n+    // tear down function.\n+    val keys = splayTree.exportKeys\n+    splayTree = null\n+\n+    splaySamples = 0\n+    splaySumOfSquaredPauses = 0\n+\n+    // Verify that the splay tree has the right size.\n+    val length = keys.length\n+    if (length != kSplayTreeSize)\n+      throw new Exception(\"Splay tree has wrong size\")\n+\n+    // Verify that the splay tree has sorted, unique keys.\n+    for (i <- 0 until length - 1) {\n+      if (keys(i) >= keys(i + 1))\n+        throw new Exception(\"Splay tree not sorted\")\n+    }\n+  }\n+\n+  private def splayRun(): Unit = {\n+    // Replace a few nodes in the splay tree.\n+    for (i <- 0 until kSplayTreeModifications) {\n+      val key = insertNewNode()\n+      val greatest = splayTree.findGreatestLessThan(key)\n+      if (greatest == null) splayTree.remove(key)\n+      else splayTree.remove(greatest.key)\n+    }\n+    splayUpdateStats(System.nanoTime())\n+  }\n+}\n+\n+/**\n+ * Constructs a Splay tree.  A splay tree is a self-balancing binary\n+ * search tree with the additional property that recently accessed\n+ * elements are quick to access again. It performs basic operations\n+ * such as insertion, look-up and removal in O(log(n)) amortized time.\n+ *\n+ * @constructor\n+ */\n+class SplayTree[T <: AnyRef] {\n+\n+  /**\n+   * Pointer to the root node of the tree.\n+   *\n+   * @type {SplayTree.Node}\n+   * @private\n+   */\n+  private var root: Node = null\n+\n+  /**\n+   * @return {boolean} Whether the tree is empty.\n+   */\n+  @inline\n+  def isEmpty: Boolean = root == null\n+\n+  /**\n+   * Inserts a node into the tree with the specified key and value if\n+   * the tree does not already contain a node with the specified key. If\n+   * the value is inserted, it becomes the root of the tree.\n+   *\n+   * @param {number} key Key to insert into the tree.\n+   * @param {*} value Value to insert into the tree.\n+   */\n+  def insert(key: Int, value: T): Unit = {\n+    if (isEmpty) {\n+      root = new Node(key, value)\n+    } else {\n+      // Splay on the key to move the last node on the search path for\n+      // the key to the root of the tree.\n+      splay(key)\n+      if (root.key != key) {\n+        val node = new Node(key, value)\n+        if (key > root.key) {\n+          node.left = root\n+          node.right = root.right\n+          root.right = null\n+        } else {\n+          node.right = root\n+          node.left = root.left\n+          root.left = null\n+        }\n+        root = node\n+      }\n+    }\n+  }\n+\n+  /**\n+   * Removes a node with the specified key from the tree if the tree\n+   * contains a node with this key. The removed node is returned. If the\n+   * key is not found, an exception is thrown.\n+   *\n+   * @param {number} key Key to find and remove from the tree.\n+   * @return {SplayTree.Node} The removed node.\n+   */\n+  def remove(key: Int): Node = {\n+    if (isEmpty) {\n+      throw new Exception(s\"Key not found: $key\")\n+    } else {\n+      splay(key)\n+      if (root.key != key) {\n+        throw new Exception(s\"Key not found: $key\")\n+      } else {\n+        val removed = root\n+        if (root.left == null) {\n+          root = root.right\n+        } else {\n+          val right = root.right\n+          root = root.left\n+          // Splay to make sure that the new root has an empty right child.\n+          splay(key)\n+          // Insert the original right child as the right child of the new\n+          // root.\n+          root.right = right\n+        }\n+        removed\n+      }\n+    }\n+  }\n+\n+  /**\n+   * Returns the node having the specified key or null if the tree doesn't contain\n+   * a node with the specified key.\n+   *\n+   * @param {number} key Key to find in the tree.\n+   * @return {SplayTree.Node} Node having the specified key.\n+   */\n+  def find(key: Int): Node = {\n+    if (isEmpty) {\n+      null\n+    } else {\n+      splay(key)\n+      if (root.key == key) root\n+      else null\n+    }\n+  }\n+\n+  /**\n+   * @return {SplayTree.Node} Node having the maximum key value.\n+   */\n+  def findMax(opt_startNode: Node): Node = {\n+    if (isEmpty) {\n+      null\n+    } else {\n+      var current =\n+        if (opt_startNode != null) opt_startNode\n+        else root\n+      while (current.right != null) {\n+        current = current.right\n+      }\n+      current\n+    }\n+  }\n+\n+  /**\n+   * @return {SplayTree.Node} Node having the maximum key value that\n+   *     is less than the specified key value.\n+   */\n+  def findGreatestLessThan(key: Int): Node = {\n+    if (isEmpty) {\n+      null\n+    } else {\n+      // Splay on the key to move the node with the given key or the last\n+      // node on the search path to the top of the tree.\n+      splay(key)\n+      // Now the result is either the root node or the greatest node in\n+      // the left subtree.\n+      if (root.key < key) {\n+        root\n+      } else if (root.left != null) {\n+        findMax(root.left)\n+      } else {\n+        null\n+      }\n+    }\n+  }\n+\n+  /**\n+   * @return {Array<*>} An array containing all the keys of tree's nodes.\n+   */\n+  def exportKeys: Array[Int] = {\n+    // Both variants have a similar performance\n+     var b = Array.newBuilder[Int]\n+     if (!isEmpty)\n+        root.traverse(node => b += node.key)\n+     b.result()\n+//    val arr = new js.Array[Int]\n+//    if (!isEmpty)\n+//      root.traverse(node => arr.push(node.key))\n+//    arr\n+  }\n+\n+  /**\n+   * Perform the splay operation for the given key. Moves the node with\n+   * the given key to the top of the tree.  If no node has the given\n+   * key, the last node on the search path is moved to the top of the\n+   * tree. This is the simplified top-down splaying algorithm from:\n+   * \"Self-adjusting Binary Search Trees\" by Sleator and Tarjan\n+   *\n+   * @param {number} key Key to splay the tree on.\n+   * @private\n+   */\n+  private def splay(key: Int): Unit = {\n+    if (isEmpty) {\n+      // Do nothing\n+    } else {\n+      // Create a dummy node.  The use of the dummy node is a bit\n+      // counter-intuitive: The right child of the dummy node will hold\n+      // the L tree of the algorithm.  The left child of the dummy node\n+      // will hold the R tree of the algorithm.  Using a dummy node, left\n+      // and right will always be nodes and we avoid special cases.\n+      val dummy = Node.newDummy()\n+      var left = dummy\n+      var right = dummy\n+      var current = root\n+      var break = false\n+      while (!break) {\n+        if (key < current.key) {\n+          if (current.left == null) {\n+            break = true\n+          } else {\n+            if (key < current.left.key) {\n+              // Rotate right.\n+              val tmp = current.left\n+              current.left = tmp.right\n+              tmp.right = current\n+              current = tmp\n+              if (current.left == null) {\n+                break = true\n+              }\n+            }\n+            if (!break) {\n+              // Link right.\n+              right.left = current\n+              right = current\n+              current = current.left\n+            }\n+          }\n+        } else if (key > current.key) {\n+          if (current.right == null) {\n+            break = true\n+          } else {\n+            if (key > current.right.key) {\n+              // Rotate left.\n+              val tmp = current.right\n+              current.right = tmp.left\n+              tmp.left = current\n+              current = tmp\n+              if (current.right == null) {\n+                break = true\n+              }\n+            }\n+            if (!break) {\n+              // Link left.\n+              left.right = current\n+              left = current\n+              current = current.right\n+            }\n+          }\n+        } else {\n+          break = true\n+        }\n+      }\n+      // Assemble.\n+      left.right = current.left\n+      right.left = current.right\n+      current.left = dummy.right\n+      current.right = dummy.left\n+      root = current\n+    }\n+  }\n+\n+  /**\n+   * Constructs a Splay tree node.\n+   *\n+   * @param {number} key Key.\n+   * @param {*} value Value.\n+   */\n+  class Node(val key: Int, val value: T) {\n+\n+    /**\n+     * @type {SplayTree.Node}\n+     */\n+    var left: Node = null\n+\n+    /**\n+     * @type {SplayTree.Node}\n+     */\n+    var right: Node = null\n+\n+    /**\n+     * Performs an ordered traversal of the subtree starting at\n+     * this SplayTree.Node.\n+     *\n+     * @param {function(SplayTree.Node)} f Visitor function.\n+     * @private\n+     */\n+    def traverse(f: Node => Unit): Unit = {","path":"splay/src/main/scala/org/scalajs/benchmark/splay/Splay.scala","position":424,"original_position":424,"commit_id":"20c041d3680333adee22e481a1e16c27af1409f8","original_commit_id":"20c041d3680333adee22e481a1e16c27af1409f8","user":{"login":"sjrd","id":535934,"avatar_url":"https://avatars.githubusercontent.com/u/535934?v=3","gravatar_id":"","url":"https://api.github.com/users/sjrd","html_url":"https://github.com/sjrd","followers_url":"https://api.github.com/users/sjrd/followers","following_url":"https://api.github.com/users/sjrd/following{/other_user}","gists_url":"https://api.github.com/users/sjrd/gists{/gist_id}","starred_url":"https://api.github.com/users/sjrd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sjrd/subscriptions","organizations_url":"https://api.github.com/users/sjrd/orgs","repos_url":"https://api.github.com/users/sjrd/repos","events_url":"https://api.github.com/users/sjrd/events{/privacy}","received_events_url":"https://api.github.com/users/sjrd/received_events","type":"User","site_admin":false},"body":"One thing to try: type `f` as `js.Function1[Node, Unit]` to test whether that is a performance bottleneck.","created_at":"2015-11-05T14:15:27Z","updated_at":"2015-11-05T14:15:27Z","html_url":"https://github.com/sjrd/scalajs-benchmarks/pull/1#discussion_r44015080","pull_request_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls/comments/44015080"},"html":{"href":"https://github.com/sjrd/scalajs-benchmarks/pull/1#discussion_r44015080"},"pull_request":{"href":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls/1","id":49825085,"html_url":"https://github.com/sjrd/scalajs-benchmarks/pull/1","diff_url":"https://github.com/sjrd/scalajs-benchmarks/pull/1.diff","patch_url":"https://github.com/sjrd/scalajs-benchmarks/pull/1.patch","issue_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/issues/1","number":1,"state":"open","locked":false,"title":"Add Splay benchmark.","user":{"login":"nicolasstucki","id":3648029,"avatar_url":"https://avatars.githubusercontent.com/u/3648029?v=3","gravatar_id":"","url":"https://api.github.com/users/nicolasstucki","html_url":"https://github.com/nicolasstucki","followers_url":"https://api.github.com/users/nicolasstucki/followers","following_url":"https://api.github.com/users/nicolasstucki/following{/other_user}","gists_url":"https://api.github.com/users/nicolasstucki/gists{/gist_id}","starred_url":"https://api.github.com/users/nicolasstucki/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nicolasstucki/subscriptions","organizations_url":"https://api.github.com/users/nicolasstucki/orgs","repos_url":"https://api.github.com/users/nicolasstucki/repos","events_url":"https://api.github.com/users/nicolasstucki/events{/privacy}","received_events_url":"https://api.github.com/users/nicolasstucki/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-11-05T13:44:11Z","updated_at":"2015-11-05T14:15:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"227c4e0fdb2850bbb00351fb98a4adc3b95e7404","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls/1/commits","review_comments_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls/1/comments","review_comment_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls/comments{/number}","comments_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/issues/1/comments","statuses_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/statuses/20c041d3680333adee22e481a1e16c27af1409f8","head":{"label":"nicolasstucki:splay","ref":"splay","sha":"20c041d3680333adee22e481a1e16c27af1409f8","user":{"login":"nicolasstucki","id":3648029,"avatar_url":"https://avatars.githubusercontent.com/u/3648029?v=3","gravatar_id":"","url":"https://api.github.com/users/nicolasstucki","html_url":"https://github.com/nicolasstucki","followers_url":"https://api.github.com/users/nicolasstucki/followers","following_url":"https://api.github.com/users/nicolasstucki/following{/other_user}","gists_url":"https://api.github.com/users/nicolasstucki/gists{/gist_id}","starred_url":"https://api.github.com/users/nicolasstucki/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nicolasstucki/subscriptions","organizations_url":"https://api.github.com/users/nicolasstucki/orgs","repos_url":"https://api.github.com/users/nicolasstucki/repos","events_url":"https://api.github.com/users/nicolasstucki/events{/privacy}","received_events_url":"https://api.github.com/users/nicolasstucki/received_events","type":"User","site_admin":false},"repo":{"id":45382692,"name":"scalajs-benchmarks","full_name":"nicolasstucki/scalajs-benchmarks","owner":{"login":"nicolasstucki","id":3648029,"avatar_url":"https://avatars.githubusercontent.com/u/3648029?v=3","gravatar_id":"","url":"https://api.github.com/users/nicolasstucki","html_url":"https://github.com/nicolasstucki","followers_url":"https://api.github.com/users/nicolasstucki/followers","following_url":"https://api.github.com/users/nicolasstucki/following{/other_user}","gists_url":"https://api.github.com/users/nicolasstucki/gists{/gist_id}","starred_url":"https://api.github.com/users/nicolasstucki/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nicolasstucki/subscriptions","organizations_url":"https://api.github.com/users/nicolasstucki/orgs","repos_url":"https://api.github.com/users/nicolasstucki/repos","events_url":"https://api.github.com/users/nicolasstucki/events{/privacy}","received_events_url":"https://api.github.com/users/nicolasstucki/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/nicolasstucki/scalajs-benchmarks","description":"Scala.js Benchmarks","fork":true,"url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks","forks_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/forks","keys_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/teams","hooks_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/hooks","issue_events_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/issues/events{/number}","events_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/events","assignees_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/assignees{/user}","branches_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/branches{/branch}","tags_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/tags","blobs_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/git/refs{/sha}","trees_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/statuses/{sha}","languages_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/languages","stargazers_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/stargazers","contributors_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/contributors","subscribers_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/subscribers","subscription_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/subscription","commits_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/commits{/sha}","git_commits_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/git/commits{/sha}","comments_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/comments{/number}","issue_comment_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/issues/comments{/number}","contents_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/contents/{+path}","compare_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/merges","archive_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/downloads","issues_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/issues{/number}","pulls_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/pulls{/number}","milestones_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/milestones{/number}","notifications_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/labels{/name}","releases_url":"https://api.github.com/repos/nicolasstucki/scalajs-benchmarks/releases{/id}","created_at":"2015-11-02T08:51:22Z","updated_at":"2015-11-02T08:51:22Z","pushed_at":"2015-11-05T13:43:03Z","git_url":"git://github.com/nicolasstucki/scalajs-benchmarks.git","ssh_url":"git@github.com:nicolasstucki/scalajs-benchmarks.git","clone_url":"https://github.com/nicolasstucki/scalajs-benchmarks.git","svn_url":"https://github.com/nicolasstucki/scalajs-benchmarks","homepage":null,"size":385,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"sjrd:master","ref":"master","sha":"00fc8808c621c1ee7fa01882e6d4ffc8c8aec294","user":{"login":"sjrd","id":535934,"avatar_url":"https://avatars.githubusercontent.com/u/535934?v=3","gravatar_id":"","url":"https://api.github.com/users/sjrd","html_url":"https://github.com/sjrd","followers_url":"https://api.github.com/users/sjrd/followers","following_url":"https://api.github.com/users/sjrd/following{/other_user}","gists_url":"https://api.github.com/users/sjrd/gists{/gist_id}","starred_url":"https://api.github.com/users/sjrd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sjrd/subscriptions","organizations_url":"https://api.github.com/users/sjrd/orgs","repos_url":"https://api.github.com/users/sjrd/repos","events_url":"https://api.github.com/users/sjrd/events{/privacy}","received_events_url":"https://api.github.com/users/sjrd/received_events","type":"User","site_admin":false},"repo":{"id":13674336,"name":"scalajs-benchmarks","full_name":"sjrd/scalajs-benchmarks","owner":{"login":"sjrd","id":535934,"avatar_url":"https://avatars.githubusercontent.com/u/535934?v=3","gravatar_id":"","url":"https://api.github.com/users/sjrd","html_url":"https://github.com/sjrd","followers_url":"https://api.github.com/users/sjrd/followers","following_url":"https://api.github.com/users/sjrd/following{/other_user}","gists_url":"https://api.github.com/users/sjrd/gists{/gist_id}","starred_url":"https://api.github.com/users/sjrd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sjrd/subscriptions","organizations_url":"https://api.github.com/users/sjrd/orgs","repos_url":"https://api.github.com/users/sjrd/repos","events_url":"https://api.github.com/users/sjrd/events{/privacy}","received_events_url":"https://api.github.com/users/sjrd/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sjrd/scalajs-benchmarks","description":"Scala.js Benchmarks","fork":true,"url":"https://api.github.com/repos/sjrd/scalajs-benchmarks","forks_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/forks","keys_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/teams","hooks_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/hooks","issue_events_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/issues/events{/number}","events_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/events","assignees_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/assignees{/user}","branches_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/branches{/branch}","tags_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/tags","blobs_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/git/refs{/sha}","trees_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/statuses/{sha}","languages_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/languages","stargazers_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/stargazers","contributors_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/contributors","subscribers_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/subscribers","subscription_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/subscription","commits_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/commits{/sha}","git_commits_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/git/commits{/sha}","comments_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/comments{/number}","issue_comment_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/issues/comments{/number}","contents_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/contents/{+path}","compare_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/merges","archive_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/downloads","issues_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/issues{/number}","pulls_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls{/number}","milestones_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/milestones{/number}","notifications_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/labels{/name}","releases_url":"https://api.github.com/repos/sjrd/scalajs-benchmarks/releases{/id}","created_at":"2013-10-18T09:37:07Z","updated_at":"2015-09-29T06:05:11Z","pushed_at":"2015-11-05T13:44:12Z","git_url":"git://github.com/sjrd/scalajs-benchmarks.git","ssh_url":"git@github.com:sjrd/scalajs-benchmarks.git","clone_url":"https://github.com/sjrd/scalajs-benchmarks.git","svn_url":"https://github.com/sjrd/scalajs-benchmarks","homepage":null,"size":492,"stargazers_count":6,"watchers_count":6,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":6,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls/1"},"html":{"href":"https://github.com/sjrd/scalajs-benchmarks/pull/1"},"issue":{"href":"https://api.github.com/repos/sjrd/scalajs-benchmarks/issues/1"},"comments":{"href":"https://api.github.com/repos/sjrd/scalajs-benchmarks/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/sjrd/scalajs-benchmarks/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/sjrd/scalajs-benchmarks/statuses/20c041d3680333adee22e481a1e16c27af1409f8"}}}}