Guava Interner 遗漏了一些性能改进的潜力
Guava Interner misses some potential for performance improvement
我对 Java 对象内部化很感兴趣。似乎很难提供避免陷阱的高性能实现,所以我倾向于使用库。一种选择是来自 Google Guava 的 Interner
。但我突然想到:这种实现不会错过一些提高性能的潜力吗? (番石榴遗漏了什么?不可能是真的。很可能,我在这里遗漏了一些东西!请赐教。)
对象内部化的一个优点是可以通过指针比较实现对象相等,即a.equals(b)
等价于a == b
,比基于字段比较的equaliy快很多。但是要内部化的对象不能将其 boolean equals(Object b)
功能实现为 return this == b
:Interner
库要求您创建一个对象,然后通过对象的 [=41] 将其与 interned 对象进行比较=] equals()
方法(即通过比较对象的字段)。只有内化后,才能使用==
。 hash()
.
也有类似的论点
现在,我不想在我的代码中将所有 a.equals(b)
替换为 a == b
。 (无论如何,等效的功能是 Objects.requireNonNull(a) && a == b
。)对于 hash()
,没有这样的 "trick"。因此,您为内部化付出了代价,但并没有充分利用它。
如何改进?提供定义两个方法 boolean realEquals(Object other)
和 int realHash()
的接口 Internalizable
。当计划内化某个class的对象时,使class实现Internalizable
并相应地重命名equals()
和hash()
。 Interner
要求其对象实现该接口,将使用 WeakHashMap
(或类似)的特殊实现,它使用这些方法而不是 equals()
和 hash()
。
即使调用虚拟 equals
方法(包含 ==
比较)的性能也不如直接通过 ==
进行比较。我建议您替换 equals
方法。
然而,如果有一个原因你不能安全地这样做:好的 equals 方法(以及那些由 IDE 生成的)开始于一些短路 returns,例如
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
MyObject other = (MyObject) obj;
这样的 equals
方法应该和您预期的一样高效。
我对 Java 对象内部化很感兴趣。似乎很难提供避免陷阱的高性能实现,所以我倾向于使用库。一种选择是来自 Google Guava 的 Interner
。但我突然想到:这种实现不会错过一些提高性能的潜力吗? (番石榴遗漏了什么?不可能是真的。很可能,我在这里遗漏了一些东西!请赐教。)
对象内部化的一个优点是可以通过指针比较实现对象相等,即a.equals(b)
等价于a == b
,比基于字段比较的equaliy快很多。但是要内部化的对象不能将其 boolean equals(Object b)
功能实现为 return this == b
:Interner
库要求您创建一个对象,然后通过对象的 [=41] 将其与 interned 对象进行比较=] equals()
方法(即通过比较对象的字段)。只有内化后,才能使用==
。 hash()
.
现在,我不想在我的代码中将所有 a.equals(b)
替换为 a == b
。 (无论如何,等效的功能是 Objects.requireNonNull(a) && a == b
。)对于 hash()
,没有这样的 "trick"。因此,您为内部化付出了代价,但并没有充分利用它。
如何改进?提供定义两个方法 boolean realEquals(Object other)
和 int realHash()
的接口 Internalizable
。当计划内化某个class的对象时,使class实现Internalizable
并相应地重命名equals()
和hash()
。 Interner
要求其对象实现该接口,将使用 WeakHashMap
(或类似)的特殊实现,它使用这些方法而不是 equals()
和 hash()
。
即使调用虚拟 equals
方法(包含 ==
比较)的性能也不如直接通过 ==
进行比较。我建议您替换 equals
方法。
然而,如果有一个原因你不能安全地这样做:好的 equals 方法(以及那些由 IDE 生成的)开始于一些短路 returns,例如
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
MyObject other = (MyObject) obj;
这样的 equals
方法应该和您预期的一样高效。