我无法理解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,那么将创建两个列表。
List<E> list = new List<E>();List<E> fixedList = new List<E>(length);但是在本例中创建list #1是多余的,因为它是Iterable other的复制。它只是浪费CPU时间和内存。
在这种情况下,该算法将更高效,因为它不会创建不必要的列表#1 (growable是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;
}还是我错了,错过了编程的一些微妙之处?
发布于 2013-07-05 20:30:36
我们通常避免在迭代时调用length getter,因为它可能具有线性性能和副作用。例如:
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);如果List.from调用length getter,它将运行所有元素两次(where不缓存其结果)。它将进一步执行副作用(打印1,2,3)两次.有关Iterable的更多信息,请参见这里。
最后,我们希望更改List.from代码,以避免第二次分配和复制。为此,我们需要(内部)功能,将可增长的列表转换为固定长度的列表。跟踪错误:http://dartbug.com/9459
发布于 2013-07-05 19:25:13
它看起来只是对现有函数的增量更新。
这个函数刚开始于
List<E> list = new List<E>();
for (E e in other) {
list.add(e);
}并将更多的位作为对许多图书馆进行相当大的重构的一部分添加。
我想说的是,最好的方法是在dartbug.com上引发一个bug报告,或者添加一个补丁,或者提交一个CL --参见这里的说明:https://code.google.com/p/dart/wiki/Contributing (注意,您确实需要先跳过一些循环,但是一旦设置好了,就可以了)。
这也可能是值得的,从最初的承诺,让他们知道你的计划,向其中一个提交者或评审员写一条便条。
https://stackoverflow.com/questions/17494568
复制相似问题