2012-04-30 2 views
3

나는 backbone.js의 0.5.3에서 0.9.2로 업그레이드했으며, 응용 프로그램의 속도가 현저히 떨어지는 것을 보았습니다. 응용 프로그램은 많은 대형 컬렉션을 처리하고 특정 시점에 많은 수의 모델을 추가합니다. 한 번에 0 ~ 600 개의 모델을 추가 할 수 있습니다. 0.5.3 버전에서는 sortedIndex 함수가 CPU의 12 %를 차지하는 데 가장 많이 사용되었습니다. 0.9.2 버전에서 코드는 상당히 느려졌고 sortBy 함수는 CPU의 70 %를 차지했습니다.0.5.3에서 0.9.2로 수집 비 효율성 증가

필자는 컬렉션을 정렬 된 상태로 유지해야하는 위치에 각 모델을 추가하는 대신 모든 모델을 추가한다고 생각합니다. 이전 방법이나 다른 방법으로 속도를 높이는 데 사용할 수있는 플래그가 있습니까? 내 대형 데이터 세트에 맞는 고유 한 컬렉션 클래스를 구현할 수 있다는 것을 알았지 만 지금은 백본 컬렉션을 고수하고 싶어합니다. 여기

컬렉션 비교기에게 사전에

comparator: function(model) { 
    return model.get("timestamp"); 
} 

감사하다

+0

여기에 어떤 라이브러리가 있습니까? 등뼈? – Pointy

답변

3

당신은 2 개의 인수를 comparator 사용하여 시도 할 수 :

비교기 기능 중 하나 sortBy (패스로 정의 할 수 있습니다 하나의 인수를 취하는 함수) 또는 (두 개의 인수를 요구하는 비교 함수를 전달).

그래야 Underscore의 sortBy이 아닌 네이티브를 사용할 수 있습니다. sortBy_.pluck_.map 호출에서 약간의 오버 헤드가 있고 Schwartzian Transform에 대한 개체를 빌드하는 데 오버 헤드가 있습니다. Schwartzian Transform은 정렬 키를 계산할 때 값 비싼 것이므로 실제로 의미가 있습니다. m.get(a)은 비싸지 않으며 m.attributes[a] (모두 get입니다)은 여전히 ​​저렴합니다.

그래서 쉽게 첫 번째 시도는 다음과 같습니다

comparator: function(a, b) { 
    if(a.attributes.timestamp < b.attributes.timestamp) 
     return -1; 
    else if(a.attributes.timestamp > b.attributes.timestamp) 
     return 1; 
    return 0; 
} 

Collection#add method 않는 각 삽입에 대한 일종의 컬렉션 :

for (i = 0, length = models.length; i < length; i++) { 
    //... 
    if (this.comparator && options.at == null) this.sort({silent: true}); 
    //... 
} 

당신이 at 옵션을 사용하여 모델을 넣어하는 방법을 알려하지 않는; "add" 이벤트에는 새로 추가 된 요소의 색인이 포함되어 있으므로 컬렉션에 각 삽입시 정렬해야 이벤트에 올바른 값이 적용됩니다. 그러나 add에 전화하기 전에 모델을 미리 정렬하고 올바른 삽입 지점을 수동으로 찾을 수 있다면 add 내에서 sort 호출을 건너 뛸 수 있습니다. 모델 하나 하나를 추가해야 할 수도 있지만 어렵지 않습니다. 새로운 모델 (미리 정렬 된 모델)과 기존 컬렉션을 동시에 살펴 봄으로써 각 모델에 맞는 삽입 지점을 찾습니다.

+0

이것은 완벽했습니다. 어쨌든 데이터를 정렬 할 때 처음부터이 작업을 수행 했어야했으며 데이터 내에 겹침이 없다는 것을 알고있었습니다. options.at 메서드를 사용하여 문제를 해결했습니다. 감사 – georgephillips