Frage

In "Core Java 1" habe ich gelesen

Achtung: Eine ArrayList ist weitaus weniger effizient als ein int [] -Array, da jeder Wert in einem Objekt getrennt eingewickelt ist. Sie möchten dieses Konstrukt nur für kleine Sammlungen verwenden, wenn Programmierer bequemer als Effizienz ist.

Aber in meiner Software habe ich aufgrund einiger Anforderungen bereits ArrayList anstelle von normalen Arrays verwendet, obwohl "die Software eine hohe Leistung haben soll und nachdem ich den zitierten Text gelesen habe, begann ich in Panik!" Eine Sache, die ich ändern kann, ist die Änderung der doppelten Variablen, um das automatische Boxen zu verhindern, und ich weiß nicht, ob das lohnt oder nicht, im nächsten Beispielalgorithmus

public void multiply(final double val)
    {
        final int rows = getSize1();
        final int cols = getSize2();
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                this.get(i).set(j, this.get(i).get(j) * val);
            }
        }
    }

Meine Frage ist, macht das Wechseln von Double in Double einen Unterschied? Oder ist das eine Mikrooptimierung, die nichts beeinflusst? Denken Sie daran, dass ich große Matrizen verwenden könnte. 2. Soll ich das gesamte Programm erneut neu gestalten?

War es hilfreich?

Lösung

Das große Problem mit double gegen Double ist, dass letzteres eine gewisse Menge Speicheraufwand hinzufügt-8 Bytes pro Objekt auf einer Sonne 32-Bit-JVM, möglicherweise mehr oder weniger für andere. Dann benötigen Sie weitere 4 Bytes (8 auf einem 64-Bit-JVM), um sich auf das Objekt zu beziehen.

Unter der Annahme, dass Sie 1.000.000 Objekte haben, sind die Unterschiede wie folgt:

double[1000000]

8 Bytes pro Eintrag; Gesamt = 8.000.000 Bytes

Double[1000000]

16 Bytes pro Objektinstanz + 4 Bytes pro Referenz; insgesamt = 20.000.000 Bytes

Ob dies wichtig ist oder nicht, hängt sehr von Ihrer Bewerbung ab. Wenn Ihnen nicht der Gedächtnis ausgeht, gehen Sie davon aus, dass es keine Rolle spielt.

Andere Tipps

Es verändert den Ort, an dem Autoboxen passiert, aber sonst nichts.

Und 2. nein, mach dir darüber keine Sorgen. Es ist unwahrscheinlich, dass es ein Engpass ist. Sie können einige Benchmarks erstellen, um es für die Größe Ihrer Daten zu messen, um zu beweisen, dass der Unterschied in Bezug auf Ihre Anwendungsleistung unbedeutend ist.

Das Doppel ist dramatisch teurer als das Doppel, aber in 90% der Fälle spielt es keine Rolle.

Wenn Sie eine effiziente Matrixklasse wünschen, würde ich empfehlen, eine der Bibliotheken zu verwenden, die dies bereits effizient tun. zB JAMA.

Wechseln double Argument in Double Hilft nicht viel, es wird die Leistung leicht verschlechtern, da es für die Multiplikation nicht mehr entbindert werden muss.

Was hilft, ist die Verhinderung mehrerer Anrufe an get() wie in:

    for (int i = 0; i < rows; i++)
    {
        List row = this.get(i);

        for (int j = 0; j < cols; j++)
        {
            row.set(j, row.get(j) * val);
        }
    }

(Übrigens, ich habe den Typ für Zeile erraten.)

Angenommen, Sie verwenden eine Liste von Listen, indem Sie Iteratoren verwenden, anstatt über Loop -Indizes zu erhalten und einzustellen, wird eine weitere Leistung gewinnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top