Colt McAnlis ist eigentlich eine coole Socke, wenn es um Android und Performance geht. Doch manchmal haut er den ein oder andere komischen Tipp raus. Man erinnert sich beispielsweise an #enumsmatter.
Nun gibt es wieder einen, auch nicht ganz so “schlimmen”, Tipp von ihm.
Es geht darum performantere JSON files zu erstellen.
In seinem Beispiel nimmt er ein Folk Objekt. Dieses soll von einem “langsamen” JSON file in ein schnelleres JSON file umgewandelt werden.
Das langsame JSON File:
{
"folks" : [
{ "name" : "Colt", "hair" : "bald", "id" : 1},
{ "name" : "Reto", "hair" : "brown", "id" : 2},
{ "name" : "Aleks", "hair" : "bald", "id" : 3 }
]
}
Das schnelle JSON File:
{
"folks" : {
"names" : ["Colt", "Reto", "Aleks"],
"hair" : ["bald", "brown", "bald"],
"id" : [1, 2, 3]
}
}
Ohne selbst die Benchmark Tools auszupacken, erkannt man meiner Meinung nach schon beim ersten Blick, dass zweiteres “schneller” ist. Was Colt ja auch bestätigt.
Mein Problem: Die OOP.
Das langsame JSON kann man nämlich super Objektorientiert umwandeln. Die einzelnen Klassen würde so aussehen:
Das Folk Objekt
public class Folks {
private ArrayList<Person> mPersons = new ArrayList<>();
public void setPersons(ArrayList<Person> persons) {
this.mPersons = persons;
}
// Getter
}
Das Person Objekt
public class Person {
private String mName;
private String mHair;
private int mId;
public void setName(String name) {
this.mName = name;
}
public void setHair(String hair) {
this.mHair = hair;
}
public void setId(int id) {
this.mId = id;
}
// Getter
}
Hier hat man richtig schöne Objekte. Es gibt ein Folk (oder Gruppe), bestehend aus einer Gruppe (oder Liste) von Personen. Eine Person (als Objekt) hat wiederum einen Namen, eine Haarfarbe und eine Id. That’s it.
Das schnellere JSON Objekte, nachdem serilisieren, würde so aussehen:
public class Folks {
private ArrayList<String> mNames = new ArrayList<>();
private ArrayList<String> mHairs = new ArrayList<>();
private ArrayList<Integer> mIds = new ArrayList<>();
public void setNames(ArrayList<String> names) {
this.mNames = names;
}
public void setHairs(ArrayList<String> hairs) {
this.mHairs = hairs;
}
public void setIds(ArrayList<Integer> ids) {
this.mIds = ids;
}
// Getter
}
Wie oben schon erwähnt, erkennt man schon vom “drauf schauen”, dass es schneller sein könnte/schneller ist. Nur noch ein Objekt und das arbeitet nur mit primitiven (ja ich weiß, String und Integer sind nicht primitiv aber — ihr wisst schon ;)) Datentypen.
Wie dem auch sei. Unser Folks Objekt, was vorher schön eine Gruppe von Personen beinhaltet, hält nun drei Listen. Eine für Namen, eine für die Haarfarbe und eine für die Id’s.
Ziemlich hässlich.
Ich für meinen Teil bleibe lieber bei einem “langsamen” parsen/serialisieren und mit schönen Objektorientierten Objekten statt auf Performance und hässliche Objekten zu setzten, die genau nicht sind, was sie seien sollten.