我需要比较数百个点才能在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;
}


这非常好,因为可以将我的Point与对象(在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编译。

非常感谢。

最佳答案

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


  正如Donald Knuth所写:“我们应该忘记效率低下的问题,大约有97%的时间是这样:过早的优化是万恶之源。” instanceof的性能可能不会成为问题,因此在确定这是问题之前,请不要浪费时间来提出奇异的解决方法。


因此,不,在对程序进行基准测试并确定标准程序成为瓶颈之前,请不要使用自定义的equals方法。

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

09-27 00:18
查看更多