簡體   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