我只是在考慮以下情況:
假設我們有一個如下所示的線定義。這里的起點和終點都是點。
let line = {
start: {x:0, y:0},
end: {x:0,y:0},
orientation: 'vertical'
}
現在想象我們有一個非常大的行陣列,我們如何節省空間?我知道你可以用'vertical'列舉替換方向值。但是你能在不降低可讀性的情況下節省鍵名的空間嗎?例如,您可以替換orientation為o,但現在不再清楚 key 代表什么。
讓我知道!
uj5u.com熱心網友回復:
如果您的意思是記憶體使用,那么如今 Javascript 引擎非常聰明,例如在內部使用查找鍵、字串重復資料洗掉等,使得使用短或長的鍵名幾乎沒有影響。
例如,使用上面的資料結構,我將 100 萬條記錄推送到一個陣列中,一條具有很長的鍵名,一條具有 1 個字符的鍵名。在這兩種情況下,每個專案的記憶體使用量約為 147 位元組。即使使用 constvertical也幾乎沒有效果。
但是正如你所看到的,147 位元組確實很高,所以如果你想減少這個,你需要使用 TypedArrays,不幸的是,這些可能有點難以理解。但如果記憶是一個值得關注的問題。
如果您確實使用了 TypedArray,則可以使用 getter 和 setter 來簡化此操作。這樣做你可能每條記錄使用 33 個位元組,4 個雙精度和 1 個位元組。
但在做任何事情之前,我首先要確保做這種優化是必要的。預優化 Javascript 是一件傻事。
附言。我使用 NodeJs 進行了記憶體測驗,它基本上使用 Chrome 的 Javascript 引擎。
此外,如果您想了解如何影響記憶體,并且安裝了 NodeJ,這里有一些示例代碼可以幫助您入門。
const oused = process.memoryUsage().heapUsed;
const values = [];
for (let l = 0; l < 1000000; l = 1) {
values.push({
start: { x: 0, y: 0 },
end: { x: 0, y: 0 },
orientation: "vertical",
});
}
console.log(process.memoryUsage().heapUsed - oused);
uj5u.com熱心網友回復:
這是一條在可用性和記憶體效率之間取得平衡的線的表示。它不使用字串識別符號,因為資料的位置被編碼到型別中。它還使用標準陣列,因為您沒有指定笛卡爾坐標平面的大小(所以我不能建議像 TypedArray 這樣的有界容器):
TS游樂場
type Point = [x: number, y: number];
type Line = [a: Point, b: Point];
const line: Line = [[0, 0], [0, 2]];
// More memory efficient: 2 fewer arrays per line:
type CompactLine = [...a: Point, ...b: Point];
const compactLine: CompactLine = [0, 0, 0, 2];
uj5u.com熱心網友回復:
我建議您為所有縮短版本的鍵創建一個映射,并將該映射與您的物件并行使用。映射可以將物件鍵作為映射鍵,將完整形式作為值
const map = new Map()
const object = {
o: 4
} // o means orientation
map.set("o", "orientation")
const mapKeys = Array.from(map.keys())
const redeableObj = {}
mapKeys.forEach(key => {
const redeableKey = map.get(key)
redeableObj[redeableKey] = object[key]
})
console.log(object)
console.log(redeableObj)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/442492.html
標籤:javascript 打字稿 目的 高效记忆
