2015-06-23 12 views
16

Artykuł (link poniżej) sugeruje, że użycie właściwości length na ciągu tworzy odwołanie do obiektu, co niepotrzebnie spowalnia funkcję.Czy lodash _.size() jest szybszy niż własność JS length?

http://www.webreference.com/programming/javascript/jkm3/2.html

W tym kontekście, co jest zaletą korzystania lodash _.size()? Czy działa inaczej niż właściwość length (natywna ...?)?

Jeśli liczą Państwo tablicę lub klucze w obiekcie, czy istnieje jakaś korzyść z używania wielkości do zacierania zamiast właściwości length?

+0

Byłem podejrzliwy co do wniosku w tym artykule, więc próbowałem odtworzyć benchmark i nie uzyskałem porównywalnego wyniku; czasy, które otrzymuję to 2,25 i 2,14 mikrosekundy. Podejrzewam, że autor przeprowadził ich testy jakiś czas temu i używał teraz bardzo powolnej maszyny, bardzo przestarzałej implementacji JavaScriptu lub obu. Nie o to się teraz martwię. – goldfire

Odpowiedz

15

ze źródeł lodash, _.size() jest zaimplementowany jako:

function size(collection) { 
    var length = collection ? getLength(collection) : 0; 
    return isLength(length) ? length : keys(collection).length; 
} 

dla tablicy, pierwsza linia jest pośrednio robi collection.length tak że _.size() jest, jeśli w ogóle, trochę (małe) trochę wolniej.

W artykule dotyczącym wydajności problem z wydajnością polega na tym, że wyszukiwanie właściwości length jest używane, gdy liczba na stosie mogła zostać wykorzystana do osiągnięcia tego samego celu. Innymi słowy, rozwiązaniem nie było szukanie szybszej własności, ale całkowite uniknięcie własności, gdy można to zrobić.

20

Funkcja size() jest najbardziej przydatna w łańcuchach, gdy potrzebny jest rozmiar wyniku. Nie ma sensu rozpakowywać wszystkiego, używając tylko value() tylko po to, by uzyskać rozmiar. Na przykład:

_(_.range(10)) 
    .filter(function(item) { return item % 2; }) 
    .size(); 

W przeciwieństwie do dłuższej formie:

_(_.range(10)) 
    .filter(function(item) { return item % 2; }) 
    .value() 
    .length; 

Funkcja ta ułatwia również znaleźć rozmiaru obiektu:

_.size({ a: 1, b: 2 }); 

W przeciwieństwie do:

Object.keys({ a: 1, b: 2 }).length; 

size() dotyczy zwięzłości kodu, a nie wydajności.

Powiązane problemy