Script Preparation code:
AخA
 
// classes declared here can't be accessed in test cases for some reason...
Tests:
  • class without declared fields

    x
     
    class X {
      constructor(foo, bar, baz) {
        this.foo = foo;
        this.bar = bar;
        this.baz = baz;
      }
      sum() {
        return this.foo + this.bar + this.baz;
      }
    }
    let i = 1000;
    let y = 0;
    while (i--) {
      let x = new X(1, 2, 3);
      y += x.foo + x.bar + x.baz;
      y += x.sum();
    }
    return y;
  • class with declared fields

     
    class X {
      foo;
      bar;
      baz;
      constructor(foo, bar, baz) {
        this.foo = foo;
        this.bar = bar;
        this.baz = baz;
      }
      sum() {
        return this.foo + this.bar + this.baz;
      }
    }
    let i = 1000;
    let y = 0;
    while (i--) {
      let x = new X(1, 2, 3);
      y += x.foo + x.bar + x.baz;
      y += x.sum();
    }
    return y;
  • function constructor

     
    function X(foo, bar, baz) {
      this.foo = foo;
      this.bar = bar;
      this.baz = baz;
    }
    X.prototype.sum = function() {
      return this.foo + this.bar + this.baz;
    }
    let i = 1000;
    let y = 0;
    while (i--) {
      let x = new X(1, 2, 3);
      y += x.foo + x.bar + x.baz;
      y += x.sum();
    }
    return y;
  • object literal

     
    function X(foo, bar, baz) {
      return {foo, bar, baz};
    }
    function sum(x) {
      return x.foo + x.bar + x.baz;
    }
    let i = 1000;
    let y = 0;
    while (i--) {
      let x = {foo: 1, bar: 2, baz: 3};
      y += x.foo + x.bar + x.baz;
      y += sum(x);
    }
    return y;
  • object literal & sum.call

     
    function X(foo, bar, baz) {
      return {foo, bar, baz};
    }
    function sum() {
      return this.foo + this.bar + this.baz;
    }
    let i = 1000;
    let y = 0;
    while (i--) {
      let x = X(1, 2, 3);
      y += x.foo + x.bar + x.baz;
      y += sum.call(x);
    }
    return y;
  • object literal & sum.bind

     
    function X(foo, bar, baz) {
      let x = {foo, bar, baz};
      x.sum = sum.bind(x);
      return x;
    }
    function sum() {
      return this.foo + this.bar + this.baz;
    }
    let i = 1000;
    let y = 0;
    while (i--) {
      let x = X(1, 2, 3);
      y += x.foo + x.bar + x.baz;
      y += x.sum();
    }
    return y;
  • Object.create

     
    function X(foo, bar, baz) {
      let x = Object.create(proto);
      x.foo = foo;
      x.bar = bar;
      x.baz = baz;
      return x;
    }
    const proto = {
      sum() {
        return this.foo + this.bar + this.baz;
      }
    }
    let i = 1000;
    let y = 0;
    while (i--) {
      let x = X(1, 2, 3);
      y += x.foo + x.bar + x.baz;
      y += x.sum();
    }
    return y;
  • Object.setPrototypeOf

     
    function X(foo, bar, baz) {
      let x = {foo, bar, baz};
      Object.setPrototypeOf(x, proto);
      return x;
    }
    const proto = {
      sum() {
        return this.foo + this.bar + this.baz;
      }
    }
    let i = 1000;
    let y = 0;
    while (i--) {
      let x = X(1, 2, 3);
      y += x.foo + x.bar + x.baz;
      y += x.sum();
    }
    return y;
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    class without declared fields
    class with declared fields
    function constructor
    object literal
    object literal & sum.call
    object literal & sum.bind
    Object.create
    Object.setPrototypeOf

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: one month ago)
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3.1 Safari/605.1.15
Safari 18 on Mac OS X 10.15.7
View result in a separate tab
Test name Executions per second
class without declared fields 63465.6 Ops/sec
class with declared fields 81251.4 Ops/sec
function constructor 67440.1 Ops/sec
object literal 1583286.2 Ops/sec
object literal & sum.call 1613394.8 Ops/sec
object literal & sum.bind 91517.2 Ops/sec
Object.create 47204.8 Ops/sec
Object.setPrototypeOf 43916.7 Ops/sec