我需要比较数百个点才能在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)
。这只是一个例子。一个有趣的事实是,程序员在猜测瓶颈方面臭名昭著。首先测量,然后将精力集中在实际需要的地方。