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;
}

Pointmyをオブジェクト ( で使用される)と比較できるため、これはかなり良いことですが、 s をそれらの間でArrayList.contains()比較する必要があることがよくありPointます。だから私はオーバーロードしましたequals():

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

問題は次のとおりです。2 番目の方法には利点がありますか? Point2 つのインスタンスが直接比較され、instanceof とキャストが不要な場合は、2 つのインスタンスを比較する方が高速ですか。

boolean result = onePoint.equals(otherPoint);

プラットフォームについて: コードは android では android SDK(19) を使用してコンパイルされ、iOSではavianを使用して AOT コンパイルされます。

どうもありがとう。

4

2 に答える 2

2

この他の回答からの引用: https://stackoverflow.com/a/103600/641955

ドナルド・クヌースが書いたように、「私たちは小さな効率性を忘れるべきです。たとえば、約 97% の場合です。時期尚早の最適化はすべての悪の根源です。」instanceof のパフォーマンスはおそらく問題にならないので、それが問題であると確信できるまで、エキゾチックな回避策を考え出すことに時間を無駄にしないでください。

equalsしたがって、プログラムのベンチマークを行い、標準の方法がボトルネックであると特定するまでは、カスタム方法を使用しないでください。これはほとんどありません。

おそらく他にも改善できることがあります。たとえばArrayList.containsO(N)操作である using について言及しています。Setの代わりにa を使用することを検討してくださいO(1)。これはほんの一例です。面白いことに、プログラマーはボトルネックを推測するのが苦手です。最初に測定し、実際に必要なところにエネルギーを集中させます。

于 2015-10-02T05:51:14.570 に答える
0

オーバーロードされたequals()メソッドは、クラスと生活を複雑にしますが、おそらく実用的なメリットはほとんどありません。アプリケーションのパフォーマンスを測定し、かなりの時間が に費やされていることがわかったPoint.equals()場合は、より軽量なオーバーロードを提供するなどして、アプリケーションを高速化する方法を探すことが適切な場合があります。そうでなければ、しないでください。

于 2015-10-01T17:21:04.443 に答える