Skip to content

Instantly share code, notes, and snippets.

@chuckadams
Created April 22, 2020 18:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chuckadams/c378beae67b824d893acc8f435ca01cf to your computer and use it in GitHub Desktop.
Save chuckadams/c378beae67b824d893acc8f435ca01cf to your computer and use it in GitHub Desktop.
JavaScript V8 inline cache behavior differences
main()
function main() {
monomorphic()
polymorphic()
megamorphic()
}
function bench(label, people) {
const ITERATIONS = 1000 * 1000 * 1000;
console.time(label)
for (var i = 0; i < ITERATIONS; i++) {
people[i & 7].lastname
}
console.timeEnd(label);
}
function monomorphic() {
// monomorphic
const han = {firstname: "Han", lastname: "Solo"}
const luke = {firstname: "Luke", lastname: "Skywalker"}
const leia = {firstname: "Leia", lastname: "Organa"}
const obi = {firstname: "Obi", lastname: "Wan"}
const yoda = {firstname: "", lastname: "Yoda"}
const people = [han, luke, leia, obi, yoda, luke, leia, obi]
bench("monomorphic", people)
}
function polymorphic() {
const han = {firstname: "Han", lastname: "Solo", gender: "male"}
const luke = {firstname: "Luke", lastname: "Skywalker", job: "Jedi"}
const leia = {firstname: "Leia", lastname: "Organa", gender: "female"}
const obi = {firstname: "Obi", lastname: "Wan"}
const yoda = {lastname: "Yoda"}
const people = [han, luke, leia, obi, yoda, luke, leia, obi]
bench("polymorphic", people)
}
function megamorphic() {
const han = {firstname: "Han", lastname: "Solo", spacecraft: "Falcon"}
const luke = {firstname: "Luke", lastname: "Skywalker", job: "Jedi"}
const leia = {firstname: "Leia", lastname: "Organa", gender: "female"}
const obi = {firstname: "Obi", lastname: "Wan", retired: true}
const yoda = {lastname: "Yoda"}
const people = [han, luke, leia, obi, yoda, luke, leia, obi]
bench("megamorphic", people)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment