【问题标题】:Is there any selective benefit in caching string instead of an object in Java? Does it differ in Python?缓存字符串而不是Java中的对象有什么选择性好处吗?它在Python中有什么不同吗?
【发布时间】:2020-08-24 20:46:22
【问题描述】:

我的一位亲爱的同事曾经建议我,最好将对象(例如地图、JsonObjects 等)序列化为字符串并将它们存储在缓存中而不是对象本身中,以减少活动的缓存。他提供的原因是,由于所有这些对象都有自己的方法等等,它增加了对象的占用空间。我理解字符串也有自己的方法,但不是很大。他认为这仍然是一个更可取的选择,即使需要额外的成本来解析字符串并在检索期间将它们转换回原始对象。

这些声明中有水吗?或者还有其他类似的建议吗?

【问题讨论】:

    标签: performance python java caching


    【解决方案1】:

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

    在 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:这是一个微优化,大多数时候都不值得

    【讨论】:

    • 啊,我认为我的问题并没有完全按照我的意图提出。我的意思是不是存储对象,如果我将对象序列化为字符串,然后存储会更好。并从强后检索转换为对象。
    • 感谢您的详细回答。非常感谢。
    • 嗯,在实际的 JVM 中它有点复杂,并且“AnotherObject”并不总是需要额外的 8 个字节来进行数组引用。由于任何类引用占用的这 16 个字节中都有足够的未使用空间来适应该字段。在其他情况下,可能会因为填充而浪费一些空间。就像给AnotherObject添加一个字节字段会多消耗8个字节,然后再添加一个字节不会影响大小。而这一切都取决于使用的标志和 jvm 实现。
    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多