为什么在F#中,Map的读取速度比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

我们可以看到,当Map变大时,其查找速度比Dictionary慢5倍。

由于Map是只读的,因此具有所有最佳的方式来组织数据,因为它不处理插入,调整大小等。为什么它这么慢?

解决方法

C#字典是使用哈希表实现的,因此查找速度接近O(1)

由于不可变性,F#Map必须使用二叉树,因此查找速度为O(logN)

F#Map和其他不变的数据结构实际上处理插入。您仍然需要在地图上插入元素,但是要获取新地图,而旧地图仍然完好无损。为了使这一点有效,新的和旧的必须共享元素(不涉及克隆/复制)。

是的,最好的方法是使用树(F#映射,设置)或链接列表(F#列表)。