我需要比较数百个点来查找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
个。{1}}。
所以我重载了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编译。
非常感谢。
答案 0 :(得分:2)
引用其他答案:https://stackoverflow.com/a/103600/641955
正如唐纳德·克努特(Donald Knuth)所写,“我们应该忘记效率低下,大约97%的时间说:过早的优化是所有邪恶的根源。” instanceof的性能可能不会成为一个问题,所以在你确定这个问题之前,不要浪费你的时间来提出异乎寻常的解决方法。
所以不,在您对程序进行基准测试并确定标准程序成为瓶颈之前,请不要使用自定义equals
方法,这是极不可能的。
可能还有其他一些可以改进的事情。例如,您提到使用ArrayList.contains
,这是O(N)
操作。请考虑使用Set
代替O(1)
。这只是一个例子。一个有趣的事实是程序员在猜测瓶颈方面非常糟糕。首先测量,并将能量集中在实际需要的地方。
答案 1 :(得分:0)
重载的equals()
方法使您的班级和生活变得复杂,可能带来的实际好处很少。如果您测量了应用程序的性能并发现在Point.equals()
中花费了大量时间,那么可能需要寻找加快速度的方法,例如提供重量更轻的过载。否则,不要。