High-frequency large lookup data

Benchmark created on


Setup

const keyPrefix = 'someveryveryveryverylongkeyname_';
const totalItems = 1000;
const totalRemoveTimes = totalItems / 5;

function setupMap(add) {
	for (let i = 1; i <= totalItems; i++) {
		add(keyPrefix + (totalItems + i), { foo: 'bar'});
	}
}

function loopRemove(remove) {
	const step = totalItems / totalRemoveTimes;
	
	for (let i = 1; i <= totalRemoveTimes; i++) {
		remove(keyPrefix + (totalItems + Math.floor(step * i)));
	}
}

Test runner

Ready to run.

Testing in
TestOps/sec
Object map with `undefined`
let map = {};

function add(key, value) {
	map[key] = value;
}

function removeAndResetWhenEmpty(key, value) {
	map[key] = undefined;
	
	for(var item in map) {
		if (!map.hasOwnProperty(item)) continue;
		
		if (map[item] !== undefined) return;
	}
	
	// Reset if all item values are undefined
	map = {};
}

setupMap(add);
loopRemove(removeAndResetWhenEmpty);
ready
Object map with `undefined` + counter
let map = {};
let count = 0;

function add(key, value) {
	if (map[key] !== undefined) return;

	map[key] = value;
	count++;
}

function removeAndResetWhenEmpty(key, value) {
	if (map[key] === undefined) return;
	
	map[key] = undefined;
	count--;
	
	// Reset if all item values are undefined
	if (!count) {
		map = {};
	}
}

setupMap(add);
loopRemove(removeAndResetWhenEmpty);
ready
Object map with delete
let map = {};

function add(key, value) {
	map[key] = value;
}

function removeAndResetWhenEmpty(key, value) {
	delete map[key];
	
	// Reset if all item values are undefined
	if (!Object.keys(map).length) {
		map = {};
	}
}

setupMap(add);
loopRemove(removeAndResetWhenEmpty);
ready
Object map with delete + counter
let map = {};
let count = 0;

function add(key, value) {
	if (map[key] !== undefined) return;

	map[key] = value;
	count++;
}

function removeAndResetWhenEmpty(key, value) {
	if (map[key] === undefined) return;

	delete map[key];
	
	count--;
	
	// Reset if all item values are undefined
	if (!count) {
		map = {};
	}
}

setupMap(add);
loopRemove(removeAndResetWhenEmpty);
ready
Map
let map = new Map();
function add(key, value) {
	if (map.has(key)) return;
	
	map.set(key, value)
}
function removeAndResetWhenEmpty(key, value) {
	map.delete(key);
	
	// Reset if all item values are undefined
	if (!map.size) {
		map = new Map();
	}
}

setupMap(add);
loopRemove(removeAndResetWhenEmpty);
ready

Revisions

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