2016-04-25 10 views
1

Wollte testen, welche Methode wäre schneller, Entprellen Funktion, die native Winkel $timeout verwendet, oder lodash in _.debounce() Funktion gebaut.

Also ich habe Benchmark erstellt, und wollte fragen, kann dieser Benchmark als objektiv betrachtet werden, und wenn nicht, was sollte geändert werden, damit der Test für beide Funktionen gleich wäre?

https://jsfiddle.net/ues8d4pL/

mit $ timeout zu testen, Linie debounceUpdate({ value: i }, $scope.model); verwendet wird.

Um lodash Funktion

// 2. Test With lodash 
// _.debounce(function() { 
//  saveParameters({ value: i }, $scope.model); 
// }, 1000)(); 

Linien sollten uncommented sein zu testen. Für mich hat es 2585,61 Millisekunden mit $ Timeout und 4240,875 Millisekunden mit Lodash genommen.

Kann dieser Benchmark als richtig angesehen werden und wenn nicht, was muss ich ändern?

Auch welcher Weg wäre vorzuziehen, mit native $ Timeout oder Lodash Debounce?

+0

Warum würden Sie das Rad neu aufbauen? – Bergi

+0

Der Aufruf von '_.debounce (..., ...)()' entprellt nichts - es ruft die Funktion nur einmal auf. – Bergi

+0

@Bergi können Sie meinen Code korrigieren, so wäre es gleich $ Timeout-Ansatz? – user991

Antwort

2

Der Benchmark wird falsch durchgeführt.

_.debounce(function() { 
    saveParameters({ value: i }, $scope.model); 
}, 1000)(); 

erstellt eine neue entprellten Funktion bei jeder Iteration und ruft sie sofort, es zu tun setTimeout bei jeder Iteration ähnlich ist und hat keine Entprellung Wirkung. Der Grund, warum die ungedrosselte Funktion in der CPU relativ schwach ist, liegt darin, dass sie nicht (wie $timeout) tut.

Die richtige Verwendung für _.debounce, die direkt mit $timeout debounce verglichen werden können, ist

var lodashDebounceUpdate = _.debounce(function() { 
    $timeout(function() { 
     saveParameters({ value: i }, $scope.model); 
    }); 
}, 1000); 

for (...) { 
    lodashDebounceUpdate(); 
} 

Es gibt nichts wirklich ‚native‘ in $timeout, es ist nur wraps setTimeout under the hood in der Art und Weise, in der sie synchron in Daten durchführen kann.

In früheren Underscore/Lodash Implementierungen _.debounce verwendet setTimeout in ähnlicher intuitiver Weise.

In modernen Versionen sowohl Underscore und Lodash hat Implementierung geschaltet, dass die Verwendung von Date.now() und ist ~ 50000X schneller (auf privatem in-vitro-Benchmarks der Messung basiert) macht.

Also ja, ist _.debounce performanter als benutzerdefinierte $timeout/setTimeout -basierte Entprellungsfunktion, kann es von Vorteil sein, wenn entprellten Funktion Hunderte von Anrufen pro Sekunde erwartet. Andernfalls kann dies als vorzeitige Optimierung angesehen werden.