`new Map()` быстрее объектов и массивов

173
07 февраля 2019, 15:50

вопрос/ы касательно объекта Map() и его производительности

  1. у меня мап Map int key get took: 64 против 5610 это:
    1. ошибка теста
    2. так и есть
    3. хитрый хром жульничает, в реалиях оно не так
    4. это ответ хрома на шустрые массивы лиса ?
  2. почему так ?
  3. так ли быстр мап с объектами, функциями, и т.д. ?
  4. когда мап не стоит использовать ? (в контексте производительности)

предыстория

задался я вопросом, какова производительность Map и методом гугления сразу наткнулся на вот такой gist с кодом теста и результатами, в которых мап был раза в два-три шустрее объектов и массивов. думаю: дай-ка и я попробую запустить тест. и вот что получилось у меня:

результаты теста

браузер chrome(68.0)

START
Map int key set took:  1198
Obj int key set took:  5177
ray int key set took:  6113
Map int key get took:  64
Obj int key get took:  5610
ray int key get took:  5044

Map string key set took:  3614
Obj string key set took:  6296
ray string key set took:  8691
Map string key get took:  8126
Obj string key get took:  7608
ray string key get took:  6828
END 

$ node -v
v10.1.0

Map int key set took:  1208
Obj int key set took:  3516
ray int key set took:  3567
Map int key get took:  37
Obj int key get took:  2252
ray int key get took:  2018

Map string key set took:  2444
Obj string key set took:  3925
ray string key set took:  3398
Map string key get took:  712
Obj string key get took:  1706
ray string key get took:  2311

код для запуска

(мобильная версия СО не отображает snippet'ы)

function TEST(/*this: DedicatedWorkerGlobalScope*/) 
{ 
	console.log = (...mess) => this.postMessage(mess) 
	console.log('START\n') 
 
	var indexes = []; 
	{ 
		let n = 2000000; 
		while (n > 0) 
		{ 
			indexes.push(Math.random() * 2000000); 
			n--; 
		} 
	} 
 
	let looper = (callback) => 
	{ 
		let n = 2000000; 
		while (n > 0) 
		{ 
			callback(indexes[n], n); 
			n--; 
		} 
	} 
 
	let timer = (mess, callback) => 
	{ 
		let start = Date.now(); 
		callback() 
		console.log(mess, Date.now() - start); 
	} 
 
	{//#region test int 
		let map = new Map(); 
		let obj = {}; 
		let ray = []; 
 
		timer('Map int key set took: ', () => looper((key, index) => map.set(key, index))); 
		timer('Obj int key set took: ', () => looper((key, index) => obj[key] = index)); 
		timer('ray int key set took: ', () => looper((key, index) => ray[key] = index)); 
		console.log(' '); 
		timer('Map int key get took: ', () => looper((key, index) => { let dummylet = map.get(key); dummylet; })); 
		timer('Obj int key get took: ', () => looper((key, index) => { let dummylet = obj[key]; dummylet; })); 
		timer('ray int key get took: ', () => looper((key, index) => { let dummylet = ray[key]; dummylet; })); 
	}//#endregion 
 
	console.log('\n\n'); 
 
	{//#region test string 
		let map = new Map(); 
		let obj = {}; 
		let ray = []; 
 
		timer('Map string key set took: ', () => looper((key, index) => map.set('' + key, '' + index))); 
		timer('Obj string key set took: ', () => looper((key, index) => obj['' + key] = '' + index)); 
		timer('ray string key set took: ', () => looper((key, index) => ray['' + key] = '' + index)); 
		console.log(' '); 
		timer('Map string key get took: ', () => looper((key, index) => { let dummylet = map.get('' + key); dummylet; })); 
		timer('Obj string key get took: ', () => looper((key, index) => { let dummylet = obj['' + key]; dummylet; })); 
		timer('ray string key get took: ', () => looper((key, index) => { let dummylet = ray['' + key]; dummylet; })); 
	}//#endregion 
 
	console.log('\nEND') 
} 
 
 
const genCode = (f/*: Function*/) => `;(${f})();this.close()` 
 
let code = genCode(TEST) 
 
let blob = new Blob([code], { type: 'text/javascript' }) 
let url = URL.createObjectURL(blob) 
 
let myWorker = new Worker(url) 
myWorker.onmessage = ({ data }) => console.log.apply(console, data) 
myWorker.onerror = console.error

ссылки на почитать

если есть желание дополнить раздел - воспользуйтесь кнопкой править.

  • MDN Map

      Объект Map является простым ассоциативным массивом.
    Любые типы (как объекты, так и примитивы) могут быть использованы в качестве ключа или значения.

  • learn.javascript.ru/set-map

    Set, Map, WeakSet и WeakMap

      В ES-2015 появились новые типы коллекций в JavaScript:
    Set, Map, WeakSet и WeakMap.

READ ALSO
Parallax, появление элементов при горизонтальном движении страницы

Parallax, появление элементов при горизонтальном движении страницы

Есть вот такой код, писал его самПроблема в том что у меня параллакс эффект который выводит страницу справа налево

195
Появление блока по клику на ссылку

Появление блока по клику на ссылку

Немного знаю Javascript и JqueryСтолкнулся с Angular 6 CLI

174
Работа с mouseenter и mouseleave

Работа с mouseenter и mouseleave

Есть проблемаВОт код:

208