/* * Copyright (C) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ export class objectToMemorySize { private seen = new WeakSet(); /** * objectToSize * * number:8 bytes (64-bit storage) * String:一characters 2 bytes * Boolean:4 bytes * * @param object */ objectToSize(object: any): any { const objType = typeof object; switch (objType) { case 'string': return object.length * 2; case 'boolean': return 4; case 'number': return 8; case 'object': if (Array.isArray(object)) { return object.map(this.objectToSize).reduce((res, cur) => res + cur, 0); } else { return this.sizeOfObj(object); } default: return 0; } } sizeOfObj(object: any): number { if (object === null) return 0; let bytes = 0; // The key in the object also takes up memory space const props = Object.keys(object); for (let i = 0; i < props.length; i++) { const key = props[i]; // Whether the value is repeated or not, the key needs to be calculated bytes += this.objectToSize(key); if (typeof object[key] === 'object' && object[key] !== null) { // 这里需要注意value使用相同内存空间(只需计算一次内存) if (this.seen.has(object[key])) continue; this.seen.add(object[key]); } bytes += this.objectToSize(object[key]); } return bytes; } }