Laufzeit und Speicherverbrauch


#1

Spiele gerade ein wenig auf CodeEval - Coding Challenges for the World’s Best Developers herum und löse dort ein paar Challenges in Javascript, nachdem ich in der CT von dieser Seite gehört habe.

Vielleicht macht das ja auch hier ein Forenteilnehmer, macht soweit auch ganz gut Spaß. Programmiersprachen werden einige unterstützt, auch Java, Scala und Haskell, etc. pp. Clojure bekommen sie allerdings noch nicht auf die Kette.

Neben der Korrektheit des Programms werden auch die Laufzeit und der Speicherverbrauch beim Lösen der Aufgaben gemessen.
Je geringer, desto mehr Punkte, was schonmal sehr cool und motivierend ist.

Leider ist bei den Messungen eine sehr große Varianz dabei.

Beispiel

#Versuch - Laufzeit ms - Memory in bytes
#4 - 762 - 6479872
#3 - 236 - 5860509
#2 - 964 - 581632
#1 - 658 - 5169152

Bei #2 und #4 wurde der selbe Code eingereicht. Ich gehe mal von einem Fehler beim Berechnen des Speicherverbrauchs von #2 aus.
Zudem Laufzeitunterschied von 20%. Oder kann es sein dass hier ein Garbage-Collector nochmal aufgeräumt hat, bevor das Programm terminiert?

#3 konnte ich die Anzahl der Berechnungsschritte deutlich reduzieren.
Aber auf Kosten eines leicht höheren Speicherverbrauchs.

Vielleicht kann mir aber trotzdem jemand weiterhelfen.

Was ist denn am effizientesten in Punkto Laufzeit und Speicherverbrauch um z.B. Zahlen in einem Array aufzusummieren?

[javascript]function a(arr) {
return arr.reduce(function(a, b) { return a + b; }, 0);
}

function add(a, b) { return a + b; }

function b(arr) {
return arr.reduce(add, 0);
}

function c(arr) {
var sum = 0;
for(var i = 0; i < arr.length; i++) {
sum += arr**;
}
return sum;
}

var arr; //Array als Globale Variable
function d() {
var sum = 0;
for(var i = 0; i < arr.length; i++) {
sum += arr**;
}
return sum;
}[/javascript]

Bringt es etwas diese Closures, Lambdas zu vermeiden und auf Funktionen auszulagern, so dass diese dann seltener erstellt werden müssen? Wenn man also N-Verschiedene Arrays aufsummieren möchte.

Sind for-Schleifen effizienter?

Sind Arrays copy by value oder copy by reference? Soweit mir bekannt by reference. Ein Array als Globale Variable würde keinen Sinn machen.

JS macht so langsam zwar Spaß, aber so richtig Schlau werde ich daraus noch nicht. Also bezgl. Best-Practices. Wenn ich schon Javascript lerne, dann würde ich mir auch am liebsten gleich diese angewöhnen.

Lokal verwende ich nodejs. Allerdings weiss ich nicht mit was ich Laufzeit und Speicherverbrauch vernünftig messen kann. Bin über Vorschläge sehr aufgeschlossen.