Dart - 如果我按 Map 的键搜索而不是在 List 中执行 singleWhere 是否会提高性能?

Fer*_*rti 4 dart

因此,例如,鉴于我有以下课程

class Foo{
  String id;
  Foo(this.id);
}
Run Code Online (Sandbox Code Playgroud)

我想要某种 Foos 集合,然后能够通过其 id 找到任何 Foo。我想比较这两种实现方式:

带地图:

var foosMap  = <String, Foo>{"foo1": new Foo("foo1"), "foo2": new Foo("foo2")}; 
var foo2 = foosMap["foo2"];
Run Code Online (Sandbox Code Playgroud)

使用列表:

var foosList = <Foo>[new Foo("foo1"), new Foo("foo2")];
var foo2 = foosList.singleWhere((i) => i.id == "foo2");
Run Code Online (Sandbox Code Playgroud)

第一种方式(使用地图)在性能方面是否更方便?还有其他需要考虑的因素吗?

Jus*_*ani 8

这实际上取决于您正在搜索的项目数量。如果您知道 big-O 表示法,从映射中检索值是 O(1) 或常数时间,而在列表中线性搜索是 O(n) 或线性时间。这意味着无论地图中的元素不多,查找时间都是相同的,但是列表的查找时间随着元素数量的增加而增加。

因为很多程序员都使用哈希映射,而对于非常小的集合列表通常更快。如果您曾经查看过执行查找的性能关键代码,您有时会看到特殊情况下切换到列表而不是小集合的映射。了解这是否是一个好的策略的唯一方法是进行性能测试。

速度不是一切,而且我更喜欢在许多情况下地图语法的清晰性,假设您已经有了地图。如果您必须构建地图只是为了执行查找,那么singleWhere()orfirstWhere()很棒。

  • @АлександрСавин Map 可以实现为哈希表 O(1) 或二叉树 O(log(N))。Dart 使用哈希表作为默认的 Map 实现,因此将其称为 O(1) 是正确的。 (4认同)