1

我需要比较数百个点才能在 2D 网格上找到路径,我真的在寻找性能。equals()我在我Point的课堂上被覆盖:

@Override
public boolean equals(Object o)
{
    if (o instanceof Point)
    {
        Point that = (Point) o;
        return that.i == this.i && that.j == this.j;
    }
    return false;
}

这很好,因为可以将 myPoint与对象(在 中使用ArrayList.contains())进行比较,但我经常需要Point在它们之间进行比较。所以我重载了equals()

public final boolean equals(Point other)
{
    return (i == other.i) && (j == other.j);
}

问题是:第二种方法有什么好处吗?在直接比较两个实例的情况下比较两个实例是否更快Point,并且不需要 instanceof 和 cast:

boolean result = onePoint.equals(otherPoint);

关于平台:代码在android上使用android SDK(19)编译,在iOS上使用avian进行AOT编译。

非常感谢。

4

2 回答 2

2

引用其他答案:https ://stackoverflow.com/a/103600/641955

正如 Donald Knuth 所写,“我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源。” instanceof 的性能可能不会成为问题,所以在确定问题所在之前,不要浪费时间想出奇特的解决方法。

equals所以不,在您对程序进行基准测试并确定标准方法是瓶颈之前,不要使用自定义方法,这是极不可能的。

可能还有其他可以改进的地方。例如,您提到 using ArrayList.contains,这是一个O(N)操作。考虑使用 aSet来代替它O(1)。这只是一个例子。一个有趣的事实是,程序员在猜测瓶颈方面是出了名的糟糕。首先进行测量,然后将精力集中在实际需要的地方。

于 2015-10-02T05:51:14.570 回答
0

重载的equals()方法使您的课程和生活变得复杂,可能没有什么实际好处。如果您测量了应用程序的性能并发现任何可观的时间都花在了 . Point.equals(),那么寻找加速它的方法可能是合适的,例如通过提供更轻量级的重载。否则,不要。

于 2015-10-01T17:21:04.443 回答