在Java中缓存字符串而不是对象有什么选择性的好处吗?在Python中是否有区别?

问题描述 投票:0回答:1

我的一位亲爱的同事曾经建议我,最好把对象(比如说地图、JsonObjects等)序列化成字符串,然后存储在缓存中,而不是对象本身,这样可以减少缓存的活跃度。他提供的理由是,由于这些对象都有自己的方法什么的,所以会增加对象的占用空间。我理解字符串也是自带方法的,但不是很大。他建议说,即使在检索过程中要增加解析字符串并将其转换回原始对象的成本,这仍然是一个较好的选择。

这些说法有水分吗?或者说身边还有没有其他相同的建议?

performance python java caching
1个回答
0
投票

方法等每个类都会加载一次。无论你创建多少个类的实例,它们都不会占用额外的内存。

在Java中,下面对象的足迹是16个字节。

class EmptyObject {
}

如果你的对象包含了引用, 每一个引用都会增加8个字节. 因此,例如,下面对象的足迹是80个字节。

  • 16个字节用于实例定义
  • 8个字节用于阵列参考
  • 实际阵列中的16个字节
class AnotherObject {
  byte[] bytes = new byte[16];
}

现在假设我们缓存我们的对象,并假设缓存是一个美化的 HashMap,因为它本质上存储了一个键值对。

考虑以下类。对于空字符串,它需要32个字节。

class Person {
  String firstName;
  String lastName;
}

假设你的键是16字节长的字符串,32字节的对象。

如果你把一个 Person 到缓存中,它需要

  • 8个字节的密钥参考
  • 32个字节的密钥
  • 8个字节用于数值参考
  • 32个字节的值

共计:80个字节

现在,假设我们单独存储字符串。对于每个键。

  • 8个字节的密钥参考
  • 32个字节的密钥
  • 8个字节用于数值参考
  • 16个字节的值(空字符串)

乘以x2。总计:128字节


只有在这种情况下,存储字符串而不是对象才有意义。

class StringWrapper
  // the only field in the class
  String string;
}

但即便如此,节省的成本也是微不足道的。

TL;DR:这是一个微观优化,在大多数时候并不值得。

© www.soinside.com 2019 - 2024. All rights reserved.