{"action":"created","comment":{"url":"https://api.github.com/repos/thlorenz/v8-perf/pulls/comments/188708658","pull_request_review_id":120742412,"id":188708658,"diff_hunk":"@@ -1,155 +1,483 @@\n+# Ignition and TurboFan Compiler Pipeline\n+\n+_find the previous version of this document at\n+[crankshaft/compiler.md](crankshaft/compiler.md)_\n+\n+Fully activated with V8 version 5.9. Earliest LTS Node.js release with a TurboFan activated\n+pipleline is Node.js V8.\n+\n <!-- START doctoc generated TOC please keep comment here to allow auto update -->\n <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n-**Table of Contents**  *generated with [DocToc](http://doctoc.herokuapp.com/)*\n-\n-- [v8 Compiler](#v8-compiler)\n-  - [Components](#components)\n-    - [Base Compiler](#base-compiler)\n-    - [Runtime Profiler](#runtime-profiler)\n-    - [Optimizing Compiler](#optimizing-compiler)\n-    - [Deoptimization Support](#deoptimization-support)\n-  - [Optimized Code vs. Inline Caches and Unoptimized Code](#optimized-code-vs-inline-caches-and-unoptimized-code)\n-    - [Full Compiler](#full-compiler)\n-    - [Inline Caches](#inline-caches)\n-    - [Monomorphism vs. Polymorphism](#monomorphism-vs-polymorphism)\n-      - [Considerations](#considerations)\n-    - [Optimizing Compiler](#optimizing-compiler-1)\n-    - [Deoptimization](#deoptimization)\n-    - [Causes for Deoptimization](#causes-for-deoptimization)\n-      - [Modifying Object Shape](#modifying-object-shape)\n-        - [Considerations](#considerations-1)\n-  - [Efficiently Representing Values and Tagging](#efficiently-representing-values-and-tagging)\n-    - [Considerations](#considerations-2)\n-  - [Arrays](#arrays)\n-    - [Fast Elements](#fast-elements)\n-      - [Characteristics](#characteristics)\n-    - [Dictionary Elements](#dictionary-elements)\n-      - [Characteristics](#characteristics-1)\n-    - [Double Array Unboxing](#double-array-unboxing)\n-    - [Typed Arrays](#typed-arrays)\n-      - [Float64Array](#float64array)\n-    - [Considerations](#considerations-3)\n+**Table of Contents**  *generated with [DocToc](https://github.com/thlorenz/doctoc)*\n+\n+- [Goals](#goals)\n+- [Simplified Pipeline](#simplified-pipeline)\n+  - [Basic Steps](#basic-steps)\n+  - [Pipeline as Part of New V8 Architecture](#pipeline-as-part-of-new-v8-architecture)\n+  - [Detailed Phases of Frontend, Optimization and Backend Stages](#detailed-phases-of-frontend-optimization-and-backend-stages)\n+- [Advantages Over Old Pipeline](#advantages-over-old-pipeline)\n+  - [Smaller Performance Cliffs](#smaller-performance-cliffs)\n+  - [Startup Time Improved](#startup-time-improved)\n+  - [Memory Usage Reduced](#memory-usage-reduced)\n+  - [Baseline Performance Improved](#baseline-performance-improved)\n+  - [New Language Features](#new-language-features)\n+    - [New Language Features Support And Transpilers](#new-language-features-support-and-transpilers)\n   - [Resources](#resources)\n+- [Ignition Interpreter](#ignition-interpreter)\n+- [Collecting Feedback via ICs](#collecting-feedback-via-ics)\n+  - [Monomorphism vs. Polymorphism](#monomorphism-vs-polymorphism)\n+  - [Feedback Lattice](#feedback-lattice)\n+  - [Information Stored in Function Closures](#information-stored-in-function-closures)\n+- [TurboFan](#turbofan)\n+- [Speculative Optimization](#speculative-optimization)\n+  - [`add` Example of Ignition and Feedback Vector](#add-example-of-ignition-and-feedback-vector)\n+    - [Bytecode annotated](#bytecode-annotated)\n+    - [Feedback Used To Optimize Code](#feedback-used-to-optimize-code)\n+- [Deoptimization](#deoptimization)\n+  - [Bailout](#bailout)\n+    - [Example of x86 Assembly Code including Checks and Bailouts](#example-of-x86-assembly-code-including-checks-and-bailouts)\n+  - [Lazy Cleanup of Optimized Code](#lazy-cleanup-of-optimized-code)\n+  - [Deoptimization Loop](#deoptimization-loop)\n+  - [Causes for Deoptimization](#causes-for-deoptimization)\n+    - [Modifying Object Shape](#modifying-object-shape)\n+      - [Considerations](#considerations)\n+    - [Class Definitions inside Functions](#class-definitions-inside-functions)\n+      - [Considerations](#considerations-1)\n+      - [Resources](#resources-1)\n+  - [Inlining Functions](#inlining-functions)\n+- [Background Compilation](#background-compilation)\n+- [Sea Of Nodes](#sea-of-nodes)\n+  - [Advantages](#advantages)\n+- [CodeStubAssembler](#codestubassembler)\n+  - [What is the CodeStubAssember aka CSA?](#what-is-the-codestubassember-aka-csa)\n+  - [Why is it a Game Changer?](#why-is-it-a-game-changer)\n+    - [Improvements via CodeStubAssembler](#improvements-via-codestubassembler)\n+- [Recommendations](#recommendations)\n+- [Resources](#resources-2)\n+  - [Slides](#slides)\n+  - [Videos](#videos)\n+  - [More Resources](#more-resources)\n \n <!-- END doctoc generated TOC please keep comment here to allow auto update -->\n \n-# v8 Compiler\n+## Goals\n \n-## Components\n+[watch](https://youtu.be/HDuSEbLWyOY?t=7m22s)\n \n-### Base Compiler \n+> Speed up real world performance for modern JavaScript, and enable developers to build a\n+> faster future web.\n \n-- is used for all code initially\n-- generates code quickly without heavy optimizations\n-- compilation with the base compiler is very fast generates little code\n+- fast startup vs. peak performance\n+- low memory vs. max optimization\n+- Ignition Interpreter allows to run code with some amount of optimization very quickly and has\n+  very low memory footprint\n+- TurboFan makes functions that run a lot fast, sacrificing some memory in the process\n+- designed to support entire JavaScript language and make it possible to quickly add new\n+  features and to optimize them fast and incrementally\n \n-### Runtime Profiler \n+## Simplified Pipeline\n \n-- monitors the running system and identifies hot code\n+[slide: pipeline 2010](https://docs.google.com/presentation/d/1_eLlVzcj94_G4r9j9d_Lj5HRKFnq6jgpuPJtnmIBs88/edit#slide=id.g2134da681e_0_163) |\n+[slide: pipeline 2014](https://docs.google.com/presentation/d/1_eLlVzcj94_G4r9j9d_Lj5HRKFnq6jgpuPJtnmIBs88/edit#slide=id.g2134da681e_0_220) |\n+[slide: pipeline 2016](https://docs.google.com/presentation/d/1_eLlVzcj94_G4r9j9d_Lj5HRKFnq6jgpuPJtnmIBs88/edit#slide=id.g2134da681e_0_249) |\n+[slide: pipeline 2017](https://docs.google.com/presentation/d/1_eLlVzcj94_G4r9j9d_Lj5HRKFnq6jgpuPJtnmIBs88/edit#slide=id.g2134da681e_0_125)\n \n-### Optimizing Compiler \n+Once crankshaft was taken out of the mix the below pipeline was possible\n \n-- recompiles and optimizes hot code identified by the runtime profiler\n-- uses static single assignment form to perform optimizations\n-  - loop-invariant code motion\n-  - linear-scan register allocation\n-  - inlining.\n-- optimization decisions are based on type information collected while running the code produced by the base compiler\n+<img alt=\"simplified pipeline\" src=\"http://benediktmeurer.de/images/2016/v8-new-pipeline-20161125.png\" width=\"70%\">\n \n-### Deoptimization Support \n+### Basic Steps\n \n-- allows the optimizing compiler to be optimistic in the assumptions it makes when generating code\n-- deoptimization support allows to bail out to the code generated by the base compiler if the assumptions in the\n-  optimized code turn out to be too optimistic\n+1. Parse JavaScript into an [AST (abstract syntax tree)](https://en.wikipedia.org/wiki/Abstract_syntax_tree)\n+2. Generate bytecode from that AST\n+3. Turn bytecode into sequence of bytecodes by the BytecodeGenerator, which is part of the [Ignition Interpreter](https://v8project.blogspot.com/2016/08/firing-up-ignition-interpreter.html)\n+  - sequences are divided on a per function basis\n+4. Execute bytecode sequences via Ignition and collect feedback via inline caches\n+  - feedback used by Ignition itself to speed up subsequent interpretation of the bytecode\n+  - feedback used for speculative optimization by TurboFan when code is optimized\n+5. _Speculatively_ optimize and compile bytecode using collected feedback to generate optimized machine code\n+  for the current architecture\n \n-## Optimized Code vs. Inline Caches and Unoptimized Code\n+### Pipeline as Part of New V8 Architecture\n \n-[watch](http://youtu.be/VhpdsjBUS3g?t=18m53s)\n-[watch](http://youtu.be/UJPdhx5zTaw?t=26m30s)\n+<img alt=\"new v8 pipeline detailed\" src=\"http://benediktmeurer.de/images/2017/architecture-20170301.png\" width=\"70%\">\n \n-### Full Compiler\n+### Detailed Phases of Frontend, Optimization and Backend Stages\n \n-[slide](http://v8-io12.appspot.com/index.html#54)\n+[slide](https://docs.google.com/presentation/d/1H1lLsbclvzyOF3IUR05ZUaZcqDxo7_-8f4yJoxdMooU/edit#slide=id.g18ceb14729_0_135)\n \n-- generates code for any JavaScript\n-- all code starts unoptimized\n-- initial (quick) JIT \n-- is not great and knows (almost) nothing about types\n-- needed to start executing code ASAP\n-- uses Inline Caches (ICs) to refine knowledge about types at runtime\n+<img alt=\"phases\" src=\"http://benediktmeurer.de/images/2017/turbofan-20171213.png\" width=\"70%\">\n \n-### Inline Caches\n+## Advantages Over Old Pipeline\n \n-[slide](http://v8-io12.appspot.com/index.html#55)\n+[watch old architecture](https://youtu.be/HDuSEbLWyOY?t=8m51s) | [watch new architecture](https://youtu.be/HDuSEbLWyOY?t=9m21s)\n+\n+- reduces memory and startup overhead significantly\n+- AST no longer source of truth that compilers need to agree on\n+- AST much simpler and smaller in size\n+- TurboFan uses Ignition bytecode directly to optimize (no re-parse needed)\n+- bytecode is 25-50% the size of equivalent baseline machine code\n+- combines cutting-edge IR (intermediate representation) with multi-layered translation +\n+  optimization pipeline\n+- relaxed [sea of nodes](#sea-of-nodes) approach allows more effective reordering and optimization when generating\n+  CFG\n+- to achieve that fluid code motion, control flow optimizations and precise numerical range\n+  analysis are used\n+- clearer separation between JavaScript, V8 and the target architectures allows cleaner, more\n+  robust generated code and adds flexibility\n+- generates better quality machine code than Crankshaft JIT\n+- crossing from JS to C++ land has been minimized using techniques like CodeStubAssembler\n+- as a result optimizations can be applied in more cases and are attempted more aggressively\n+- for the same reason (and due to other improvements) TurboFan inlines code more aggressively,\n+  leading to even more performance improvements\n+\n+### Smaller Performance Cliffs\n+\n+- for most websites the optimizing compiler isn't important and could even hurt performance\n+  (speculative optimizations aren't cheap)\n+- pages need to load fast and unoptimized code needs to run fast _enough_, esp. on mobile\n+  devices\n+- previous V8 implementations suffered from _performance cliffs_\n+  - optimized code ran super fast (focus on peak performance case)\n+  - baseline performance was much lower\n+  - as a result one feature in your code that caused deoptimization would affect your app's\n+    performance dramatically, i.e. 100x difference\n+- TurboFan improves this as\n+  - widens fast path to ensure that optimized code is more flexible and can accept more types\n+    of arguments\n+  - reduces code memory overhead by reusing code generation parts of TurboFan to build Ignition\n+    interpreter\n+  - improves slow path\n+\n+### Startup Time Improved\n+\n+[watch](https://youtu.be/M1FBosB5tjM?t=43m25s)\n+\n+- bytecode smaller and faster to generate than machine code (crankshaft)\n+- bytecode better suited for smaller icache (low end mobile)\n+- code parsed + AST converted to bytecode only once and optimized from bytecode\n+- data driven ICs reduced slow path cost (collected in feedback form, previously collected in code form)\n+\n+### Memory Usage Reduced\n+\n+[watch](https://youtu.be/M1FBosB5tjM?t=47m20s)\n+\n+- most important on mobile\n+- Ignition code up to 8x smaller than Full-Codegen code (crankshaft)\n+\n+### Baseline Performance Improved\n+\n+[watch](https://youtu.be/M1FBosB5tjM?t=37m)\n+\n+- no longer relying on optimizing compiler for _sufficiently_ fast code\n+- thus improved baseline performance allows delaying optimization until more feedback is collected\n+- leads to less time and resources spent optimizing","path":"compiler.md","position":null,"original_position":235,"commit_id":"fe82604bde1b0cba88587fdc5bb679d15dec1d31","original_commit_id":"281b693c4cd5f60f1158d7546ad1386231d88b35","user":{"login":"thlorenz","id":192891,"avatar_url":"https://avatars0.githubusercontent.com/u/192891?v=4","gravatar_id":"","url":"https://api.github.com/users/thlorenz","html_url":"https://github.com/thlorenz","followers_url":"https://api.github.com/users/thlorenz/followers","following_url":"https://api.github.com/users/thlorenz/following{/other_user}","gists_url":"https://api.github.com/users/thlorenz/gists{/gist_id}","starred_url":"https://api.github.com/users/thlorenz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thlorenz/subscriptions","organizations_url":"https://api.github.com/users/thlorenz/orgs","repos_url":"https://api.github.com/users/thlorenz/repos","events_url":"https://api.github.com/users/thlorenz/events{/privacy}","received_events_url":"https://api.github.com/users/thlorenz/received_events","type":"User","site_admin":false},"body":"Addressed in fe82604","created_at":"2018-05-16T17:28:53Z","updated_at":"2018-05-16T17:28:53Z","html_url":"https://github.com/thlorenz/v8-perf/pull/14#discussion_r188708658","pull_request_url":"https://api.github.com/repos/thlorenz/v8-perf/pulls/14","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/thlorenz/v8-perf/pulls/comments/188708658"},"html":{"href":"https://github.com/thlorenz/v8-perf/pull/14#discussion_r188708658"},"pull_request":{"href":"https://api.github.com/repos/thlorenz/v8-perf/pulls/14"}},"in_reply_to_id":185449903},"pull_request":{"url":"https://api.github.com/repos/thlorenz/v8-perf/pulls/14","id":181048915,"html_url":"https://github.com/thlorenz/v8-perf/pull/14","diff_url":"https://github.com/thlorenz/v8-perf/pull/14.diff","patch_url":"https://github.com/thlorenz/v8-perf/pull/14.patch","issue_url":"https://api.github.com/repos/thlorenz/v8-perf/issues/14","number":14,"state":"open","locked":false,"title":"turbo: updating all docs to current state","user":{"login":"thlorenz","id":192891,"avatar_url":"https://avatars0.githubusercontent.com/u/192891?v=4","gravatar_id":"","url":"https://api.github.com/users/thlorenz","html_url":"https://github.com/thlorenz","followers_url":"https://api.github.com/users/thlorenz/followers","following_url":"https://api.github.com/users/thlorenz/following{/other_user}","gists_url":"https://api.github.com/users/thlorenz/gists{/gist_id}","starred_url":"https://api.github.com/users/thlorenz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thlorenz/subscriptions","organizations_url":"https://api.github.com/users/thlorenz/orgs","repos_url":"https://api.github.com/users/thlorenz/repos","events_url":"https://api.github.com/users/thlorenz/events{/privacy}","received_events_url":"https://api.github.com/users/thlorenz/received_events","type":"User","site_admin":false},"body":"## Updating to latest v8\r\n\r\nUpdated all the documents to reflect changes in v8, mainly the compiler chain as well as the garbage collector.\r\n\r\nNumerous documents focus on one topic specifically and I include a quick summary + link to the document below as well as the diff. I did that b/c I feel looking at the diff makes things much harder to read than when looking at the original file, but comments would make sense in the diff.\r\nI'm hoping that the experts from the v8 team and community can review a document that most matches their expertise and point out any information that is not quite correct so I can correct it.\r\n\r\n**Please note that all documents inside the `./crankshaft` folder are the old versions and don't need to be reviewed. Please review the ones at the top level of this repo (and linked below) instead.**\r\n\r\nObviously pull requests are also very welcome :)\r\n\r\n### Compiler\r\n\r\nThe [v8 compiler](https://github.com/thlorenz/v8-perf/blob/turbo-updates/compiler.md) | [diff](https://github.com/thlorenz/v8-perf/compare/turbo-updates?expand=1#diff-b49978087b88c89a5fa214b85931590b) document outlines the v8 compiler pipeline including the\r\nIgnition Interpreter and TurboFan optimizing compiler. It explains how information about your\r\ncode is executed to allow optimizations, how and when deoptimizations occur and how features\r\nlike the CodeStubAssembler allowed reduce performance bottlenecks found in the [older\r\npipeline](https://github.com/thlorenz/v8-perf/blob/turbo-updates/crankshaft/compiler.md).\r\n\r\n### Language Features\r\n\r\nThe [language features](https://github.com/thlorenz/v8-perf/blob/turbo-updates/language-features.md) | [diff](https://github.com/thlorenz/v8-perf/compare/turbo-updates?expand=1#diff-760a1ebc2a62f1b12ce76c6947cd4390) document lists JavaScript language features and\r\nprovides info with regard to their performance mainly to provide assurance that performance of\r\nmost features is no longer an issue as it was with the previous compiler pipeline.\r\n\r\n### Garbage Collector\r\n\r\nThe [v8 garbage collector](https://github.com/thlorenz/v8-perf/blob/turbo-updates/gc.md) | [diff](https://github.com/thlorenz/v8-perf/compare/turbo-updates?expand=1#diff-dd25f7f05abfbcd228db92bb870d89b6) document talks about how memory is organized on the v8 heap,\r\nhow garbage collection is performed and how it was parallelized as much as possible to avoid\r\npausing the main thread more than necessary.\r\n\r\n### Memory Profiling\r\n\r\nThe [memory profiling](https://github.com/thlorenz/v8-perf/blob/turbo-updates/memory-profiling.md) | [diff](https://github.com/thlorenz/v8-perf/compare/turbo-updates?expand=1#diff-e7fe1dc69ba71e2ee2721d647d59b47d) document explains how JavaScript objects are\r\nreferenced to form a tree of nodes which the garbage collector uses to determine _collectable_\r\nobjects. It also outlines numerous techniques to profile memory leaks and allocations.\r\n\r\n### Inspection and Performance Profiling\r\n\r\nInside the [inspection](https://github.com/thlorenz/v8-perf/blob/turbo-updates/inspection.md) | [diff](https://github.com/thlorenz/v8-perf/compare/turbo-updates?expand=1#diff-1ab137d931a59172f302cba93e8e965a) document you will find techniques that allow you to\r\nprofile your Node.js or web app, how to produce flamegraphs and what flags and tools are\r\navailable to gain an insight into operations of v8 itself.\r\n\r\n### Snapshots and Code Caching\r\n\r\n[This document](https://github.com/thlorenz/v8-perf/blob/turbo-updates/snapshots+code-caching.md) | [diff](https://github.com/thlorenz/v8-perf/compare/turbo-updates?expand=1#diff-4c875c24d36e23ba24b060d46e9f6067) includes information as to how v8 uses caching\r\ntechniques in order to avoid recompiling scripts during initialization and thus achieve faster\r\nstartup times.\r\n\r\n### Runtime Functions\r\n\r\nThe [runtime functions](https://github.com/thlorenz/v8-perf/blob/turbo-updates/runtime-functions.md) | [diff](https://github.com/thlorenz/v8-perf/compare/turbo-updates?expand=1#diff-82eb773b939d6a4a0b9c673cb78c2689) document gives a quick intro into C++ functions\r\naccessible from JavaScript that can be used to provide information of the v8 engine as well as\r\ndirect it to take a specific action like optimize a function on next call.\r\n\r\ncc @mraleph @bmeurer @mcollina @mathiasbynens @fhinkel @ofrobots\r\n\r\nI realize these are by no means all people knowledgable about these topics, so please feel free to add more via a comment.\r\n\r\nI very much appreciate anyone taking the time to help make this a valuable resource with correct and up to date information.","created_at":"2018-04-11T22:52:09Z","updated_at":"2018-05-16T17:28:53Z","closed_at":null,"merged_at":null,"merge_commit_sha":"aae67b887d49968191d0a79840a4f68733e8a271","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/thlorenz/v8-perf/pulls/14/commits","review_comments_url":"https://api.github.com/repos/thlorenz/v8-perf/pulls/14/comments","review_comment_url":"https://api.github.com/repos/thlorenz/v8-perf/pulls/comments{/number}","comments_url":"https://api.github.com/repos/thlorenz/v8-perf/issues/14/comments","statuses_url":"https://api.github.com/repos/thlorenz/v8-perf/statuses/fe82604bde1b0cba88587fdc5bb679d15dec1d31","head":{"label":"thlorenz:turbo-updates","ref":"turbo-updates","sha":"fe82604bde1b0cba88587fdc5bb679d15dec1d31","user":{"login":"thlorenz","id":192891,"avatar_url":"https://avatars0.githubusercontent.com/u/192891?v=4","gravatar_id":"","url":"https://api.github.com/users/thlorenz","html_url":"https://github.com/thlorenz","followers_url":"https://api.github.com/users/thlorenz/followers","following_url":"https://api.github.com/users/thlorenz/following{/other_user}","gists_url":"https://api.github.com/users/thlorenz/gists{/gist_id}","starred_url":"https://api.github.com/users/thlorenz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thlorenz/subscriptions","organizations_url":"https://api.github.com/users/thlorenz/orgs","repos_url":"https://api.github.com/users/thlorenz/repos","events_url":"https://api.github.com/users/thlorenz/events{/privacy}","received_events_url":"https://api.github.com/users/thlorenz/received_events","type":"User","site_admin":false},"repo":{"id":20495349,"name":"v8-perf","full_name":"thlorenz/v8-perf","owner":{"login":"thlorenz","id":192891,"avatar_url":"https://avatars0.githubusercontent.com/u/192891?v=4","gravatar_id":"","url":"https://api.github.com/users/thlorenz","html_url":"https://github.com/thlorenz","followers_url":"https://api.github.com/users/thlorenz/followers","following_url":"https://api.github.com/users/thlorenz/following{/other_user}","gists_url":"https://api.github.com/users/thlorenz/gists{/gist_id}","starred_url":"https://api.github.com/users/thlorenz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thlorenz/subscriptions","organizations_url":"https://api.github.com/users/thlorenz/orgs","repos_url":"https://api.github.com/users/thlorenz/repos","events_url":"https://api.github.com/users/thlorenz/events{/privacy}","received_events_url":"https://api.github.com/users/thlorenz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/thlorenz/v8-perf","description":"⏱️ Notes and resources related to v8 and thus Node.js performance","fork":false,"url":"https://api.github.com/repos/thlorenz/v8-perf","forks_url":"https://api.github.com/repos/thlorenz/v8-perf/forks","keys_url":"https://api.github.com/repos/thlorenz/v8-perf/keys{/key_id}","collaborators_url":"https://api.github.com/repos/thlorenz/v8-perf/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/thlorenz/v8-perf/teams","hooks_url":"https://api.github.com/repos/thlorenz/v8-perf/hooks","issue_events_url":"https://api.github.com/repos/thlorenz/v8-perf/issues/events{/number}","events_url":"https://api.github.com/repos/thlorenz/v8-perf/events","assignees_url":"https://api.github.com/repos/thlorenz/v8-perf/assignees{/user}","branches_url":"https://api.github.com/repos/thlorenz/v8-perf/branches{/branch}","tags_url":"https://api.github.com/repos/thlorenz/v8-perf/tags","blobs_url":"https://api.github.com/repos/thlorenz/v8-perf/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/thlorenz/v8-perf/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/thlorenz/v8-perf/git/refs{/sha}","trees_url":"https://api.github.com/repos/thlorenz/v8-perf/git/trees{/sha}","statuses_url":"https://api.github.com/repos/thlorenz/v8-perf/statuses/{sha}","languages_url":"https://api.github.com/repos/thlorenz/v8-perf/languages","stargazers_url":"https://api.github.com/repos/thlorenz/v8-perf/stargazers","contributors_url":"https://api.github.com/repos/thlorenz/v8-perf/contributors","subscribers_url":"https://api.github.com/repos/thlorenz/v8-perf/subscribers","subscription_url":"https://api.github.com/repos/thlorenz/v8-perf/subscription","commits_url":"https://api.github.com/repos/thlorenz/v8-perf/commits{/sha}","git_commits_url":"https://api.github.com/repos/thlorenz/v8-perf/git/commits{/sha}","comments_url":"https://api.github.com/repos/thlorenz/v8-perf/comments{/number}","issue_comment_url":"https://api.github.com/repos/thlorenz/v8-perf/issues/comments{/number}","contents_url":"https://api.github.com/repos/thlorenz/v8-perf/contents/{+path}","compare_url":"https://api.github.com/repos/thlorenz/v8-perf/compare/{base}...{head}","merges_url":"https://api.github.com/repos/thlorenz/v8-perf/merges","archive_url":"https://api.github.com/repos/thlorenz/v8-perf/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/thlorenz/v8-perf/downloads","issues_url":"https://api.github.com/repos/thlorenz/v8-perf/issues{/number}","pulls_url":"https://api.github.com/repos/thlorenz/v8-perf/pulls{/number}","milestones_url":"https://api.github.com/repos/thlorenz/v8-perf/milestones{/number}","notifications_url":"https://api.github.com/repos/thlorenz/v8-perf/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/thlorenz/v8-perf/labels{/name}","releases_url":"https://api.github.com/repos/thlorenz/v8-perf/releases{/id}","deployments_url":"https://api.github.com/repos/thlorenz/v8-perf/deployments","created_at":"2014-06-04T18:43:14Z","updated_at":"2018-05-16T15:03:26Z","pushed_at":"2018-05-16T17:28:36Z","git_url":"git://github.com/thlorenz/v8-perf.git","ssh_url":"git@github.com:thlorenz/v8-perf.git","clone_url":"https://github.com/thlorenz/v8-perf.git","svn_url":"https://github.com/thlorenz/v8-perf","homepage":"","size":13784,"stargazers_count":822,"watchers_count":822,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":50,"mirror_url":null,"archived":false,"open_issues_count":4,"license":null,"forks":50,"open_issues":4,"watchers":822,"default_branch":"master"}},"base":{"label":"thlorenz:master","ref":"master","sha":"04b392e858da10e2e81959b7e81569ac6110d2e2","user":{"login":"thlorenz","id":192891,"avatar_url":"https://avatars0.githubusercontent.com/u/192891?v=4","gravatar_id":"","url":"https://api.github.com/users/thlorenz","html_url":"https://github.com/thlorenz","followers_url":"https://api.github.com/users/thlorenz/followers","following_url":"https://api.github.com/users/thlorenz/following{/other_user}","gists_url":"https://api.github.com/users/thlorenz/gists{/gist_id}","starred_url":"https://api.github.com/users/thlorenz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thlorenz/subscriptions","organizations_url":"https://api.github.com/users/thlorenz/orgs","repos_url":"https://api.github.com/users/thlorenz/repos","events_url":"https://api.github.com/users/thlorenz/events{/privacy}","received_events_url":"https://api.github.com/users/thlorenz/received_events","type":"User","site_admin":false},"repo":{"id":20495349,"name":"v8-perf","full_name":"thlorenz/v8-perf","owner":{"login":"thlorenz","id":192891,"avatar_url":"https://avatars0.githubusercontent.com/u/192891?v=4","gravatar_id":"","url":"https://api.github.com/users/thlorenz","html_url":"https://github.com/thlorenz","followers_url":"https://api.github.com/users/thlorenz/followers","following_url":"https://api.github.com/users/thlorenz/following{/other_user}","gists_url":"https://api.github.com/users/thlorenz/gists{/gist_id}","starred_url":"https://api.github.com/users/thlorenz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thlorenz/subscriptions","organizations_url":"https://api.github.com/users/thlorenz/orgs","repos_url":"https://api.github.com/users/thlorenz/repos","events_url":"https://api.github.com/users/thlorenz/events{/privacy}","received_events_url":"https://api.github.com/users/thlorenz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/thlorenz/v8-perf","description":"⏱️ Notes and resources related to v8 and thus Node.js performance","fork":false,"url":"https://api.github.com/repos/thlorenz/v8-perf","forks_url":"https://api.github.com/repos/thlorenz/v8-perf/forks","keys_url":"https://api.github.com/repos/thlorenz/v8-perf/keys{/key_id}","collaborators_url":"https://api.github.com/repos/thlorenz/v8-perf/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/thlorenz/v8-perf/teams","hooks_url":"https://api.github.com/repos/thlorenz/v8-perf/hooks","issue_events_url":"https://api.github.com/repos/thlorenz/v8-perf/issues/events{/number}","events_url":"https://api.github.com/repos/thlorenz/v8-perf/events","assignees_url":"https://api.github.com/repos/thlorenz/v8-perf/assignees{/user}","branches_url":"https://api.github.com/repos/thlorenz/v8-perf/branches{/branch}","tags_url":"https://api.github.com/repos/thlorenz/v8-perf/tags","blobs_url":"https://api.github.com/repos/thlorenz/v8-perf/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/thlorenz/v8-perf/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/thlorenz/v8-perf/git/refs{/sha}","trees_url":"https://api.github.com/repos/thlorenz/v8-perf/git/trees{/sha}","statuses_url":"https://api.github.com/repos/thlorenz/v8-perf/statuses/{sha}","languages_url":"https://api.github.com/repos/thlorenz/v8-perf/languages","stargazers_url":"https://api.github.com/repos/thlorenz/v8-perf/stargazers","contributors_url":"https://api.github.com/repos/thlorenz/v8-perf/contributors","subscribers_url":"https://api.github.com/repos/thlorenz/v8-perf/subscribers","subscription_url":"https://api.github.com/repos/thlorenz/v8-perf/subscription","commits_url":"https://api.github.com/repos/thlorenz/v8-perf/commits{/sha}","git_commits_url":"https://api.github.com/repos/thlorenz/v8-perf/git/commits{/sha}","comments_url":"https://api.github.com/repos/thlorenz/v8-perf/comments{/number}","issue_comment_url":"https://api.github.com/repos/thlorenz/v8-perf/issues/comments{/number}","contents_url":"https://api.github.com/repos/thlorenz/v8-perf/contents/{+path}","compare_url":"https://api.github.com/repos/thlorenz/v8-perf/compare/{base}...{head}","merges_url":"https://api.github.com/repos/thlorenz/v8-perf/merges","archive_url":"https://api.github.com/repos/thlorenz/v8-perf/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/thlorenz/v8-perf/downloads","issues_url":"https://api.github.com/repos/thlorenz/v8-perf/issues{/number}","pulls_url":"https://api.github.com/repos/thlorenz/v8-perf/pulls{/number}","milestones_url":"https://api.github.com/repos/thlorenz/v8-perf/milestones{/number}","notifications_url":"https://api.github.com/repos/thlorenz/v8-perf/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/thlorenz/v8-perf/labels{/name}","releases_url":"https://api.github.com/repos/thlorenz/v8-perf/releases{/id}","deployments_url":"https://api.github.com/repos/thlorenz/v8-perf/deployments","created_at":"2014-06-04T18:43:14Z","updated_at":"2018-05-16T15:03:26Z","pushed_at":"2018-05-16T17:28:36Z","git_url":"git://github.com/thlorenz/v8-perf.git","ssh_url":"git@github.com:thlorenz/v8-perf.git","clone_url":"https://github.com/thlorenz/v8-perf.git","svn_url":"https://github.com/thlorenz/v8-perf","homepage":"","size":13784,"stargazers_count":822,"watchers_count":822,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":50,"mirror_url":null,"archived":false,"open_issues_count":4,"license":null,"forks":50,"open_issues":4,"watchers":822,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/thlorenz/v8-perf/pulls/14"},"html":{"href":"https://github.com/thlorenz/v8-perf/pull/14"},"issue":{"href":"https://api.github.com/repos/thlorenz/v8-perf/issues/14"},"comments":{"href":"https://api.github.com/repos/thlorenz/v8-perf/issues/14/comments"},"review_comments":{"href":"https://api.github.com/repos/thlorenz/v8-perf/pulls/14/comments"},"review_comment":{"href":"https://api.github.com/repos/thlorenz/v8-perf/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/thlorenz/v8-perf/pulls/14/commits"},"statuses":{"href":"https://api.github.com/repos/thlorenz/v8-perf/statuses/fe82604bde1b0cba88587fdc5bb679d15dec1d31"}},"author_association":"OWNER"}}
{"actor":{"display_login":"thlorenz"}}