Tho*_*mas 0 performance f# containers dictionary
我偶然发现了这个页面:http : //jackfoxy.com/simple-lookups-in-fsharp/
它对用于插入和检索的各种集合进行基准测试。
如果我们看一下这张表(网页上的第二张):
String Key by Number of Elements in Lookup Structure, 10,000 random lookups
Map IntMap Dict HashTbl HshMltMap
10^2 1.3 n/a 0.4 0.3 1.5
10^3 1.7 n/a 0.4 0.4 1.5
10^4 3.0 n/a 0.7 0.7 1.8
10^5 5.3 n/a 1.5 1.2 2.4
10^6 8.4 n/a 1.6 1.5 6.3
Run Code Online (Sandbox Code Playgroud)
我们可以看到,当 Map 变大时,使用 Map 进行查找比使用 Dictionary 慢 5 倍。
由于 Map 是只读的,因此可以以最优化的方式组织数据,因为它不处理插入、调整大小等。为什么它这么慢?
C# 字典是使用哈希表实现的,因此查找速度接近于O(1).
F# Map,由于不变性,必须使用二叉树,因此查找速度为O(logN).
F# Map 和其他不可变数据结构实际上处理插入。你仍然需要向地图插入一个元素,但得到一个新地图,而旧地图仍然完好无损。为了使其有效,新的和旧的必须共享元素(不涉及克隆/复制)。
是的,最好的方法是使用树(F# Map、Set)或链表(F# List)。