performance - Scala 最高效的 Map 实现

标签 performance scala dictionary

在单个线程中创建和使用 Scala Map 时,最好的选择是什么? (就像在 StringBuffer 与 StringBuilder 上构造字符串的 java 类似的最佳赌注)。

选择 Map 的约束类型是:

  • map 创建一次,对可能的现有键进行多次添加/更新
  • map 中没有删除任何内容 - 因此可能不需要这种操作
  • map 可能有数千个值(不是很大)
  • 用法来自同一个线程(因此不必担心并行访问/更新 map )
  • map 的签名可能是 Map[String,T]。如果有理由可以使用 Map[Int/Long,T]。

  • 我调查过
  • collection.immutable.Map(最初有效 优化 用于几个键)
  • collection.immutable.HashMap
  • collection.mutable.OpenHashMap
  • collection.mutable.HashMap

  • 测试表明,50000 个 key 没有明显的赢家。
    我找到了一些
  • simple microbenchmarks comparing Scala vs Java mutable map performance - 201这表明 OpenHashMap 可能是一个不错的选择
  • New collections in Scala 2.7.2 - 2008
  • 官方scaladoc Performance Characteristics除了所有 Map 实现都采用 之外,不提供方向eC - 有效恒定时间 用于查找和添加。

  • 然而,问题是在这种情况下,一般来说什么是最安全的赌注,为什么?

    最佳答案

    如果您的 map 不是非常小也不是很大,并且您的 key 是 String ,然后 collection.mutable.AnyRefMap是个好赌注。 collection.mutable.LongMap如果您可以拥有 Long 甚至更快键。它们存在的原因正是为了快速处理常见用例。

    如果大多数 map 都非常小(0-4 个元素),那么 LinkedHashMap往往是最好的,因为它避免了哈希表的开销。 (不可变映射在 4 个或更少元素时也不错。)

    如果映射真的很大(数以百万计的键/值对),那么标准 collection.mutable.HashMap是要走的路,因为当您用完单独键的空间时,性能会稍微降低一点。

    关于performance - Scala 最高效的 Map 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29063964/

    相关文章:

    performance - F#图像处理性能问题

    json - 使用 scala play 将 Json 对象添加到 JSON 数组

    java - 从 URL 构建 XML 对象时出现文件过早结束的情况

    arrays - 为什么 Swift 字典在内存过程中比数组慢得多

    python - 列表列表 vs 字典

    arrays - 字典中的 Swift 数组导致 NSCFArray

    c# - Lambda 表达式的性能优势

    python - 哪个更快,a==2==b,或者a==2和b==2

    python - OpenCV + OS X + 外部网络摄像头 = 非常慢

    scala - 用于 Ocaml 和其他语言的基于 Actor 的分布式并发库