我的问题很像上一篇文章Optimal HashSet Initialization (Scala | Java),我想在其中使用HashSet
加速(目前我正在使用Set
)但HashSet
没有表现出它的(恒定时间)优势。
对于提到的解决方案:
您可以通过实习来最小化equals的成本。这意味着您通过工厂方法获取类的新对象,该方法检查请求的新对象是否已经存在,如果存在,则返回对现有对象的引用。如果您断言这种类型的每个对象都是以这种方式构造的,那么您就知道每个不同对象只有一个实例,并且 equals 等效于对象标识,这是一种廉价的引用比较(Scala 中的 eq)。
但是,我不太确定检查的有效方法是什么
请求的新对象是否已经存在
对于大型对象(例如带有 hashmap 参数的案例类对象,一些其他对象结构......等)
通过比较这些复杂的领域中的每一个并没有给出太多的性能优势,不是吗?或者如果是,还有其他方法吗?
另外,我也很困惑如何制作
equals 等同于对象标识,这是一种廉价的引用比较(Scala 中的 eq)。
在代码中。
我认为上面提到的意图技术基本上是一个对象缓存。因此,我参考了Java中小的不可变对象的缓存策略一文中提到的技术?. 但是,我仍然看不到大型对象的有效方法是什么。
为方便起见,我引用了帖子中的缓存技术(Java 中)并指出了///
我的想法和问题:
private static final int N_POINTS = 10191;
private static final Point[] POINTS = new Point[N_POINTS];
public static Point of(int x, int y, int z) {
int h = hash(x,y,z); /// I can use hash code of each complicated field to construct the value
int index = (h & 0x7fffffff) % N_POINTS;
Point p = POINTS[index];
if (p != null && p.x == x && p.y == y && p.z == z) /// Not working for large objects?
return p;
return POINTS[index] = new Point(x,y,z);
}
总而言之,为大型对象实施有效缓存策略的最佳实践是什么,以便我可以HashSet
在 Scala 中利用?
谢谢,