>问题
我们有高负载应用程序并使用内存缓存,我们希望在任何地方优化它。
问题
每种变量类型的重量是多少? 我的意思是:
- 布尔值作为值
- Emty 字符串是值
- 零 我想使用类似的东西
cache.set(key, '') // emty string as value
// or
cache.set(key, true) // we don't need any value, we just need check keys
(V8开发人员在这里。
选择哪个选项并不重要。 反正null
、true
、false
和""
都存在。存储对其中任何一个的引用总是需要相同数量的内存(即 4 个字节;或者在没有指针压缩的情况下在 Node 上存储 8 个字节)。
事实上,这个原则甚至更进一步。我假设你会有很多这样的缓存条目。因此,您甚至可以定义自己的对象(如果这以任何方式有用),只要您只有其中一个对象和许多对它的引用,对象的大小实际上并不重要。
例:
let big = new Array(1000); // About 4000 bytes.
let small = {answer: 42}; // About 16 bytes. (Simplifying a bit.)
for (let i = 0; i < 1000; i++) cache1.set(i, big);
for (let i = 0; i < 1000; i++) cache2.set(i, small);
for (let i = 0; i < 1000; i++) cache3.set(i, "");
for (let i = 0; i < 1000; i++) cache4.set(i, null);
for (let i = 0; i < 1000; i++) cache5.set(i, true);
完成此操作后,cache1
到cache5
的所有缓存都将具有完全相同的大小:它们每个存储 1000 个引用。这些引用指的是什么并不重要。(我不能说它会有多少字节,因为我不知道你用什么作为缓存实现。如果它是一个Map
,那么每个条目的内存消耗平均约为 12-20 字节,波动是因为后备存储以相当大的不常见步骤增长。