Сообщение от Aetae
|
По идее Set и объект должны иметь идентичную производительность на современных движках, т.к. под капотом там одно и то же. Так что логично использовать именно Set. Объект может быть даже медленнее на v8 из-за заморочек с базовым классом.
|
Тестирование проводилось на основе
https://jsbench.me/3pkjlwzhbr/1
// Входные данные для тестирования на jsbench.me
var theArr = Array.from({ length: 10000 }, (_, el) => el)
var theSet = new Set(theArr)
var theObj = Object.assign({}, ...theArr.map(num => ({ [num]: true })))
var theMap = new Map(theArr.map(num => [num, true]))
var theKey = 5000
// Тестирование поиска
theArr.includes(theKey) // 17% slower — 660,699,003.59 ops/s
theMap.has(theKey) // 1.1% slower — 785,347,360.36 ops/s
theSet.has(theKey) // 0.8% slower — 787,801,318.7 ops/s
theObj[theKey] // FASTEST — 794,522,297.06 ops/s
// Тестирование добавления
theArr.push(theKey) // 95% slower — 39,049,698.98 ops/s
theMap.set(theKey, true) // 89% slower — 82,050,365.52 ops/s
theSet.add(theKey) // 87% slower — 99,994,802.31 ops/s
theObj[theKey] = true // SUPER FASTEST — 792,917,323.61 ops/s
// Тестирование удаления
delete theArr[theKey] // 69% slower — 28,602,351.93 ops/s
theMap.delete(theKey) // 3% slower — 90,739,199.4 ops/s
theSet.delete(theKey) // FASTEST — 93,412,121 ops/s
delete theObj[theKey] // 68% slower — 29,350,950.47 ops/s
/*
ИТОГИ:
Производительность Set и Map высокая и практически идентичная во всех случаях.
У Object наивысшая и значительно опережающая производительность добавления, но низкая при удалении.
Arrays просто покинули чат с наименьшей производительностью
*/
На сколько правильно проведено тестирование?