Skip to content

Instantly share code, notes, and snippets.

@jeremiahlangner
Last active September 1, 2023 17:01
Show Gist options
  • Save jeremiahlangner/95fb2b529f505fe85d3af84fac63f12e to your computer and use it in GitHub Desktop.
Save jeremiahlangner/95fb2b529f505fe85d3af84fac63f12e to your computer and use it in GitHub Desktop.
Proxy Benchmarks
/*
Simple benchmark for Node.js proxies vs. Object.defineProperty
getter x 1,356,643,822 ops/sec ±0.09% (96 runs sampled)
proxy get x 12,188,540 ops/sec ±0.47% (90 runs sampled)
setter x 211,939,069 ops/sec ±3.95% (94 runs sampled)
proxy set x 10,336,783 ops/sec ±0.18% (95 runs sampled)
*/
import { Suite } from "benchmark";
const suite = new Suite();
let fooCount = 0;
let _fooCount = 0;
const foo: any = {
_bar: "bar",
_baz: "baz",
};
Object.defineProperty(foo, "bar", {
get() {
return foo._bar;
},
set(val: any) {
foo._bar = val;
++fooCount;
},
enumerable: true,
configurable: true,
});
Object.defineProperty(foo, "baz", {
get() {
return foo._baz;
},
set(val: any) {
foo._baz = val;
++fooCount;
},
});
const _foo = {
bar: "bar",
baz: "baz",
};
const fooProxy = new Proxy(_foo, {
get(target, prop, receiver) {
return target[prop];
},
set(target, prop, value) {
target[prop] = value;
++_fooCount;
return true;
},
});
suite
.add("getter", () => {
foo.bar;
foo.baz;
})
.add("proxy get", () => {
fooProxy.bar;
fooProxy.baz;
})
.add("setter", () => {
foo.bar = "a";
foo.baz = "b";
})
.add("proxy set", () => {
fooProxy.bar = "a";
fooProxy.baz = "b";
})
.on("cycle", (event) => {
console.log(event.target.toString());
})
.run({ async: true });
/*
A simple benchmark test for Node.js proxies
getter x 39,576,033 ops/sec ±0.99% (92 runs sampled)
proxy get x 12,161,868 ops/sec ±0.33% (94 runs sampled)
setter x 3,738,974 ops/sec ±0.18% (94 runs sampled)
proxy set x 10,329,095 ops/sec ±0.28% (94 runs sampled)
*/
import { Suite } from "benchmark";
const suite = new Suite();
let fooCount = 0;
let _fooCount = 0;
const foo = {
_bar: "bar",
_baz: "baz",
get bar() {
return this._bar;
},
set bar(val) {
this._bar = val;
++fooCount;
},
get baz() {
return "baz";
},
set baz(val) {
this._baz = val;
},
};
const _foo = {
bar: "bar",
baz: "baz",
};
const fooProxy = new Proxy(_foo, {
get(target, prop, receiver) {
return target[prop];
},
set(target, prop, value) {
target[prop] = value;
++_fooCount;
return true;
},
});
suite
.add("getter", () => {
foo.bar;
foo.baz;
})
.add("proxy get", () => {
fooProxy.bar;
fooProxy.baz;
})
.add("setter", () => {
foo.bar = "a";
foo.baz = "b";
})
.add("proxy set", () => {
fooProxy.bar = "a";
fooProxy.baz = "b";
})
.on("cycle", (event) => {
console.log(event.target.toString());
})
.run({ async: true });
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment