2

Dart SDK のアルゴリズムの有効性がわかりません。

アルゴリズムは次のとおりです(リストファクトリーdart:core、ファイルlist.dart

factory List.from(Iterable other, { bool growable: true }) {
    List<E> list = new List<E>();
    for (E e in other) {
      list.add(e);
    }
    if (growable) return list;
    int length = list.length;
    List<E> fixedList = new List<E>(length);
    for (int i = 0; i < length; i  ) {
      fixedList[i] = list[i];
    }
    return fixedList;
  }

growableの場合false、両方のリストが作成されます。

  1. List<E> list = new List<E>();
  2. List<E> fixedList = new List<E>(length);

ただし、この場合のリスト #1 の作成は、 の複製であるため冗長ですIterable other。CPU時間とメモリを浪費するだけです。

growableこの場合、このアルゴリズムは不要なリスト #1 ( is )を作成しないため、より効率的になりますfalse

factory List.from(Iterable other, { bool growable: true }) {
    if(growable) {
      List<E> list = new List<E>();
      for (E e in other) {
        list.add(e);
      }
      return list;
    }        

    List<E> fixedList = new List<E>(other.length);
    var i = 0;
    for (E e in other) {
      fixedList[i++] = e;
    }
    return fixedList;
  }

それとも、私が間違っていて、プログラミングの微妙な点を見逃しているのでしょうか?

4

2 に答える 2

2

length線形のパフォーマンスと副作用が発生する可能性があるため、通常、イテラブルでゲッターを呼び出すことは避けます。例えば:

List list = [1, 2, 3];
Iterable iterable1 = list.map((x) {
  print(x);
  return x + 1;
});
Iterable iterable2 = iterable1.where((x) => x > 2);
var fixedList = new List.from(iterable2, growable: false);

getter をList.from呼び出すと、すべての要素に対して 2 回実行されます (結果はキャッシュされません)。さらに、副作用 (printing 1, 2, 3) を 2 回実行します。Iterables の詳細については、こちらを参照してくださいlengthwhere

List.from最終的には、2 番目の割り当てとコピーを回避するようにコードを変更したいと考えています。これを行うには、拡張可能なリストを固定長のリストに変換する (内部) 機能が必要です。追跡バグ: http://dartbug.com/9459

于 2013-07-05T20:30:36.927 に答える