2010-04-07 6 views
10

Ich höre immer wieder, dass Android-Anwendungen versuchen sollten, die Anzahl der erstellten Objekte zu begrenzen, um die Arbeitslast auf dem Garbage Collector zu reduzieren. Es ist sinnvoll, dass Sie keine großen Mengen von Objekten erstellen möchten, die auf einem begrenzten Speicherbedarf gespeichert werden. Beispielsweise wäre eine traditionelle Serveranwendung, die innerhalb weniger Sekunden 100.000 Objekte erstellt hat, nicht unbekannt.Ändern des Codierungsstils aufgrund der Android GC-Leistung, wie weit ist es zu weit?

Das Problem ist, wie weit soll ich das nehmen? Ich habe Tonnen von Beispielen für Android-Anwendungen gesehen, die sich auf den statischen Zustand verlassen, um angeblich "Dinge beschleunigen" zu können. Erhöht die Erhöhung der Anzahl von Instanzen, die von Dutzenden bis zu Hunderten gesammelt werden müssen, wirklich einen großen Unterschied? Ich kann mir vorstellen, meinen Codierungsstil zu ändern, um jetzt Hunderttausende von Objekten zu erstellen, wie Sie es vielleicht auf einem vollwertigen Java-EE-Server getan haben, aber sich auf eine Menge statischer Zustände zu verlassen (angeblich) die Anzahl der Objekte zu reduzieren ungerade.

Wie viel ist es wirklich notwendig, Ihren Code-Stil zu ändern, um leistungsstarke Android-Apps zu erstellen?

Antwort

10

Die "Vermeidung Zuteilung" Beratung ist in der Regel in Bezug auf Game-Loops. Die VM muss pausieren, um Müll zu sammeln, und das möchten Sie nicht, wenn Ihr Spiel mit 30 Bildern pro Sekunde animiert. Wenn Sie keine Objekte zuweisen, muss die VM keinen Müll sammeln, um Speicher freizugeben. Wenn Sie ein Spiel haben, das ohne vom Benutzer sichtbare Schluckauf laufen muss, sollten Sie den Code in den relevanten Teilen ändern, um die Zuweisung zu minimieren oder zu eliminieren.

Wenn Sie eine App erstellen, die Rezepte enthält oder Fotos zeigt, würde ich mir keine Sorgen machen - der GC-Schluckauf ist nicht etwas, das der Benutzer wahrscheinlich bemerkt.

Zukünftige Verbesserungen des Dalvik GC (z. B. Generationskollektion) sollten dies weniger problematisch machen.

+3

Ich würde auch hinzufügen, dass Sie oft finden, Java-Code, der ursprünglich für Desktops oder Server geschrieben wurde, die extrem ineffizient ist und durch eine Tonne von Objekten im Vergleich zu der Menge der Arbeit thrash es tut. Zum Beispiel habe ich Netzwerkcode gesehen, der GCs bei der Verarbeitung von Daten aus dem Netzwerk fortwährend verursacht. Wenn Ihr Code das tut, sollten Sie ihn wirklich optimieren, nicht speziell wegen Dalvik, sondern weil er nicht für ein mobiles Gerät geeignet ist - all diese zusätzliche Arbeit kommt direkt von der Batterie. – hackbod

+1

In Bezug darauf, wie sehr der Stil tatsächlich geändert werden sollte, würde ich sagen, dass der beste Weg, Code zu schreiben, ist (und ein wenig darüber nachzudenken, zugewiesene Objekte wiederzuverwenden, aber nicht umfangreich) und sehen, ob es da ist irgendein Druck auf den GC. Wenn dies der Fall ist, starten Sie die Speicher-Profilerstellung Ihres Codes und suchen Sie nach Stellen, an denen Sie das Zuweisen und Löschen von Variablen vermeiden können. –

4

Ich würde sagen, das hängt wirklich davon ab, was du machst und was dein Programmierstil jetzt ist. Es ist immer etwas notwendig, die Hardwarebeschränkungen eines mobilen Geräts zu berücksichtigen und dementsprechend zu programmieren, aber es ist auch eine gute Übung, sich dessen bewusst zu sein, egal wo Ihre App läuft. Wenn Sie eine Menge sehr rechenintensiver Berechnungen durchführen, die in Echtzeit oder in Form eines Spiels aktualisiert werden müssen, dann sollten Sie sich mit dem NDK beschäftigen, aber wenn Sie nur normale nutzergesteuerte Dinge tun, sollte es nicht so schlimm sein . Mein Rat wäre, zu versuchen, sparsam zu sein, aber sich nicht zu viel über Optimierung zu sorgen, bis Sie ein Gefühl dafür bekommen, wie es läuft.