Performance gegen gut wartbaren, übersichtlichen Code. Mehrfach habe ich schon geschrieben, dass ich es wichtig finde hier die richtige Balance einzuhalten. Doch wo beginnt die richtige Balance und wo endet Sie, wenn man sich sicher ist einen Quelltext eigentlich nur ein Mal anzufassen, wie beispielsweise beim Setzen einer Konstante?
Als Beispiel habe ich mir Zeit ausgesucht, denn Zeit ist so wunderbar konstant und klar geregelt. In einem Snippet von mir habe ich folgende Zeilen entdeckt:
// Variante 1
TIME = {
MILLISECOND: 1,
SECOND: 1000,
MINUTE: 1000 * 60,
HOUR: 1000 * 60 * 60,
DAY: 1000 * 60 * 60 * 24,
WEEK: 1000 * 60 * 60 * 24 * 7,
MONTH: 1000 * 60 * 60 * 24 * 30,
YEAR: 1000 * 60 * 60 * 24 * 365
}
Aber muss der Browser wirklich bei jedem Aufruf diese Konstanten berechnen, wenn wir ihm nicht vorher die Arbeit abnehmen könnten? Das könnte dann kommentiert so aussehen:
// Variante 2
TIME = {
MILLISECOND: 1, // 1
SECOND: 1000, // 1000 * 1
MINUTE: 60000, // 1000 * 60
HOUR: 3600000, // 1000 * 60 * 60
DAY: 1000606024, // 1000 * 60 * 60 * 24
WEEK: 7004242168, // 1000 * 60 * 60 * 24 * 7
MONTH: 100060602430, // 1000 * 60 * 60 * 24 * 30
YEAR: 365221198760 // 1000 * 60 * 60 * 24 * 365
}
Sean hat vor dem Verfassen des Artikels mit mir darüber sinniert, dass Variante 2 zwar eine höhere Performance hätte, aber natürlich auch wesentlich feheranfälliger wäre, da man hier nicht auf einen Blick erkennen kann, ob hohe Zahlen wirklich stimmen.
Als gangbarer Mittelweg ist uns folgender eingefallen:
// Variante 3
TIME = {
MILLISECOND: 1,
SECOND: 1000 * TIME.MILLISECOND,
MINUTE: 60 * TIME.SECOND,
HOUR: 60 * TIME.MINUTE,
DAY: 24 * TIME.HOUR,
WEEK: 7 * TIME.DAY,
MONTH: 30 * TIME.MONTH,
YEAR: 365 * TIME.DAY
}
Hier werden zwar Rechnungen vorgenommen, aber wesentlich weniger als in Variante 1 und der Code ist lesbarer als Variante 2, dadurch aber langsamer.
Fazit
Es gibt immer wieder Orte, an denen man Abstriche machen muss und viele akzeptable Lösungen, je nach Zielanspruch. Welche wir wählen, sollte von den Vorraussetzungen des Produktes abhängen.
Frage
Welche der drei oben genannten Varianten findet ihr am besten? Welche würdet ihr am ehesten in Projekten einsetzen? Habt ihr vielleicht eine noch ganz andere Idee, solche Konstanten sinnvoll zu definieren? Ich freue mich auf Kommentare!