繁体   English   中英

Immutable.js:按索引获取地图实体(不是按键)

[英]Immutable.js: get map entity by index (not by key)

从索引获取OrderedMap元素的最佳方法(从速度/内存的角度来看)是什么? map.toArray(index)吗? 如果是,这项操作的费用是多少?

序列是集合的包装器,允许对底层数据进行延迟访问。 他们必须实例化一个小的包装类,但它几乎不需要内存。 该操作的复杂性是O(1)。 要访问有序集合的API,只需使用map.toIndexedSeq().get(index)map.valueSeq().get(index);

map.toArray(index)是一项昂贵的操作,因为它将整个不可变转换为本机javascript数组。 它的复杂性至少是O(n)。

 function valueSeq(coll, searchVal) { return coll.valueSeq().get(searchVal); } function indexedSeq(coll, searchVal) { return coll.toIndexedSeq().get(searchVal); } function toArray(coll, searchVal) { return coll.toArray()[searchVal]; } function toList(coll, searchVal) { return coll.toList().get(searchVal); } function arrayRange(len) { return new Array(len).fill(null).map((_, i) => `thing ${i}`); } function timeGet(checkWhat, coll, find, iters) { let startTime = performance.now(); let size = coll.length || coll.size; for (let i = 1; i < iters; i++) { let searchVal = i % coll.size, result = find(coll, searchVal); if(result != `thing ${searchVal}`){ console.log('fail', searchVal, `"${result}"`); } } return Math.floor(performance.now() - startTime); } const MIN_LEN = 10, MAX_LEN = 1e4, ITERS = 2000; console.log('\\t\\t\\tindexedSeq\\ttoArray\\t\\ttoList\\t\\tkeyedSeq'); for (let len = MIN_LEN; len <= MAX_LEN; len *= 10) { const immutOrderedSetRange = Immutable.OrderedSet(arrayRange(len)); console.log(`${len}\\t\\t\\t` + `${timeGet('indexedSeq', immutOrderedSetRange, indexedSeq, ITERS)}\\t\\t` + `${timeGet('toArray', immutOrderedSetRange, toArray, ITERS)}\\t\\t` + `${timeGet('toList', immutOrderedSetRange, toList, ITERS)}\\t\\t` + `${timeGet('valueSeq', immutOrderedSetRange, valueSeq, ITERS)}`) } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.12/immutable.js"></script> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM