3

backbone.js を 0.5.3 から 0.9.2 にアップグレードしたところ、アプリケーションの速度が大幅に低下していることに気付きました。アプリケーションは多数の大規模なコレクションを処理し、特定の時点で多数のモデルを追加します。一度に追加されるモデルは 0 ~ 600 です。バージョン 0.5.3 では、sortedIndex 関数が最も多く使用され、CPU の 12% を使用していました。バージョン 0.9.2 では、コードが大幅に遅くなり、sortBy 関数が CPU の 70% を使用していました。

コレクションをソートしたままにするために、各モデルをあるべき場所に追加するのではなく、すべてのモデルを追加してからソートしていると思われます。古い方法やその他の高速化方法を使用するために使用できるフラグはありますか。大規模なデータ セットに固有の独自のコレクション クラスを実装できることはわかっていますが、今はバックボーン コレクションに固執したいと考えています。

これがコレクションコンパレーターです

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

前もって感謝します

4

1 に答える 1

3

2つの引数を使用してみることができますcomparator

sortByコンパレーター関数は、(単一の引数を取る関数を渡す)またはsort(2つの引数を期待するコンパレーター関数を渡す)のいずれかとして定義できます。

sortアンダースコアではなくネイティブを使用できるようにしますsortBy。と呼び出し、およびシュワルツ変換のオブジェクトの構築sortByから少しオーバーヘッドがあります。シュワルツ変換は、ソートキーの計算に費用がかかり、費用がかからず、 (とにかくすべてがそうですが)さらに安価な場合にのみ意味があります。_.pluck_.mapm.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メソッドは、挿入ごとにコレクションをソートします。

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

atオプションを使用してモデルを配置する場所を指定しない限り、イベントには新しく追加された要素のインデックスが含まれるため、"add"イベントが正しい値になるように、コレクションは挿入ごとに並べ替える必要があります。ただし、呼び出す前にモデルを事前に並べ替えてadd、正しい挿入ポイントを手動で見つけることができる場合は、sort内の呼び出しをスキップできますadd。もちろん、モデルを1つずつ追加する必要があるかもしれませんが、それは難しいことではありません。新しい(事前に並べ替えられた)モデルと既存のコレクションの両方を同時に調べて、各モデルの正しい挿入ポイントを見つけます。

于 2012-04-30T04:20:51.843 に答える