Good vs Bad object shape safety

Benchmark created on


Setup

function FunctionA(object) {
	if("a" in object) {
		return object.a;
	}
	return 12;
}

function FunctionB(object) {
	if("a" in object) {
		return object.a;
	}
	return 12;
}

function FunctionC(object) {
	if("a" in object) {
		return object.a;
	}
	return 12;
}


function FunctionD(object) {
	if("a" in object) {
		return object.a;
	}
	return 12;
}

GoodTestObjects = [
{a: 1},
{a: 2},
{a: 3},
{a: 4},
{a: 5}
]
BadTestObjects = [
{a: 1},
{a: 2, b: 3},
{a: 3, c: 4},
{a: 4, d: 5},
{a: 5, e: 6}
];

// Contaimate FunctionC.
let sum = 0;
for(let j = 0; j < 3; j++) {
	for(let i = 0; i < BadTestObjects.length; i++) {
		let value = BadTestObjects[i];
		sum += FunctionC(value);
	}
}
TrueSum = sum;

Test runner

Ready to run.

Testing in
TestOps/sec
Good
let sum = 0;
for(let j = 0; j < 1000; j++) {
	for(let i = 0; i < GoodTestObjects.length; i++) {
		let value = GoodTestObjects[i];
		sum += FunctionA(value);
	}
}
TrueSum = sum;
ready
Bad
let sum = 0;
for(let j = 0; j < 1000; j++) {
	for(let i = 0; i < BadTestObjects.length; i++) {
		let value = BadTestObjects[i];
		sum += FunctionB(value);
	}
}
TrueSum = sum;
ready
Ok, but what if someone else passed in bad data earlier?
let sum = 0;
for(let j = 0; j < 1000; j++) {
	for(let i = 0; i < GoodTestObjects.length; i++) {
		let value = GoodTestObjects[i];
		// FunctionC is previously contaminated, see the setup code.
		sum += FunctionC(value);
	}
}
TrueSum = sum;
ready
What if it's already optimized and we pass in some bad data?
let sum = 0;
for(let j = 0; j < 500; j++) {
	for(let i = 0; i < GoodTestObjects.length; i++) {
		let value = GoodTestObjects[i];
		sum += FunctionD(value);
	}
}
// Contaminate FunctionD.
for(let i = 0; i < BadTestObjects.length; i++) {
	let value = BadTestObjects[i];
	sum += FunctionD(value);
}
for(let j = 0; j < 499; j++) {
	for(let i = 0; i < GoodTestObjects.length; i++) {
		let value = GoodTestObjects[i];
		sum += FunctionD(value);
	}
}
TrueSum = sum;
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.