缓存可选 <Boolean> 值
Cached Optional<Boolean> values
对于标准库中可用的 true
和 false
值,似乎没有任何 Optional<Boolean>
类型的缓存对象。我是不是哪里漏掉了它们?
如果没有这样的对象,我会感到惊讶,因为在我看来,这对于清晰度和性能来说非常有用。
如果真的没有这样的对象,那是为什么?
在Java8中,他们改进了对象创建的优化,特别是对于Optional这样的短命对象。 JIT 可以做的是使用 Escape Analysis 通过将它们的字段放在堆栈上来消除短期对象。在 Optional<Boolean>
的情况下,这很可能不会超过 boolean
请参阅以下有关对象消除的文章、如何检测它是否不起作用以及您可以采取哪些措施。 Java Lambdas and Low Latency
反过来问,为什么会有OptionalInt、OptionalLong和OptionalDouble?这些可能有用,只是不如您想象的那么有用。与 Boolean
不同,并非所有 Integer
、Long
和 Double
值都被缓存,虽然 Escape Analisys 可以消除对象,但它很昂贵并且可能需要一段时间才能启动,可能永远不要因为代码 运行 不够长。
没有理由将特定的优化策略固定到 API 中。 Optional
实例是通过工厂方法获取的,它关于返回对象标识的行为是有意未指定的。
所以实现 可以 在内部有一个缓存设施,但 JVM 的优化器也可能会处理这些事情。今天的 JVM 已经在可能的情况下消除了热点中的实例创建,但未来的 JVM 实现也可能为 “value based classes”.
注入缓存或重复数据删除功能。
另见
对于标准库中可用的 true
和 false
值,似乎没有任何 Optional<Boolean>
类型的缓存对象。我是不是哪里漏掉了它们?
如果没有这样的对象,我会感到惊讶,因为在我看来,这对于清晰度和性能来说非常有用。
如果真的没有这样的对象,那是为什么?
在Java8中,他们改进了对象创建的优化,特别是对于Optional这样的短命对象。 JIT 可以做的是使用 Escape Analysis 通过将它们的字段放在堆栈上来消除短期对象。在 Optional<Boolean>
的情况下,这很可能不会超过 boolean
请参阅以下有关对象消除的文章、如何检测它是否不起作用以及您可以采取哪些措施。 Java Lambdas and Low Latency
反过来问,为什么会有OptionalInt、OptionalLong和OptionalDouble?这些可能有用,只是不如您想象的那么有用。与 Boolean
不同,并非所有 Integer
、Long
和 Double
值都被缓存,虽然 Escape Analisys 可以消除对象,但它很昂贵并且可能需要一段时间才能启动,可能永远不要因为代码 运行 不够长。
没有理由将特定的优化策略固定到 API 中。 Optional
实例是通过工厂方法获取的,它关于返回对象标识的行为是有意未指定的。
所以实现 可以 在内部有一个缓存设施,但 JVM 的优化器也可能会处理这些事情。今天的 JVM 已经在可能的情况下消除了热点中的实例创建,但未来的 JVM 实现也可能为 “value based classes”.
注入缓存或重复数据删除功能。另见