首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我无法理解Dart SDK中算法的有效性。

我无法理解Dart SDK中算法的有效性。
EN

Stack Overflow用户
提问于 2013-07-05 17:59:43
回答 2查看 142关注 0票数 2

我无法理解Dart SDK中的算法的有效性。

下面是算法( dart:core中的列表工厂,文件list.dart)

代码语言:javascript
复制
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;
  }

如果growablefalse,那么将创建两个列表。

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

但是在本例中创建list #1是多余的,因为它是Iterable other的复制。它只是浪费CPU时间和内存。

在这种情况下,该算法将更高效,因为它不会创建不必要的列表#1 (growablefalse)。

代码语言:javascript
复制
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;
  }

还是我错了,错过了编程的一些微妙之处?

EN

回答 2

Stack Overflow用户

发布于 2013-07-05 20:30:36

我们通常避免在迭代时调用length getter,因为它可能具有线性性能和副作用。例如:

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2013-07-05 19:25:13

它看起来只是对现有函数的增量更新。

此承诺这种差异

这个函数刚开始于

代码语言:javascript
复制
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 (注意,您确实需要先跳过一些循环,但是一旦设置好了,就可以了)。

这也可能是值得的,从最初的承诺,让他们知道你的计划,向其中一个提交者或评审员写一条便条。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17494568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档