High-frequency large lookup data (v2)

Revision 2 of this benchmark created on


Setup

const keyPrefix = 'someveryveryveryverylongkeyname_';
const totalItems = 10000;
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
Map
let map = new Map();
function add(key, value) {	
	map.set(key, value)
}
function removeAndResetWhenEmpty(key, value) {
	map.delete(key);
}

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 + 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

Revisions

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