热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么Scalahashmap变慢?

如何解决《为什么Scalahashmap变慢?》经验,为你挑选了2个好方法。

那可以做些什么呢?

我已经运行了一些测试,似乎Scala Hashmap比Java HashMap慢得多.请证明我错了!

对我来说,Hashmap的重点是快速访问给定键的值.因此,当速度很重要时,我发现自己会使用Java HashMap,这有点让人伤心.我没有足够的经验肯定地说,但似乎你混合Java和Scala越多,你可能面临的问题就越多.

test("that scala hashmap is slower than java") {
    val javaMap = new util.HashMap[Int,Int](){
      for (i <- 1 to 20)
      put(i,i+1)
    }

    import collection.JavaConverters._
    val scalaMap = javaMap.asScala.toMap

    // check is a scala hashmap
    assert(scalaMap.getClass.getSuperclass === classOf[scala.collection.immutable.HashMap[Int,Int]])

    def slow = {
      val start = System.nanoTime()
      for (i <- 1 to 1000) {
        for (i <- 1 to 20) {
          scalaMap(i)
        }
      }
      System.nanoTime() - start
    }

    def fast = {
      val start = System.nanoTime()
      for (i <- 1 to 1000) {
        for (i <- 1 to 20) {
          javaMap.get(i)
        }
      }
      System.nanoTime() - start
    }

    val elapses: IndexedSeq[(Long, Long)] = {
      (1 to 1000).map({_ => (slow,fast)})
    }

    var elapsedSlow = 0L
    var elapsedFast = 0L
    for ((eSlow,eFast) <- elapses) {
      elapsedSlow += eSlow
      elapsedFast += eFast
    }

    assert(elapsedSlow > elapsedFast)

    val fraction : Double = elapsedFast.toDouble/elapsedSlow
    println(s"slower by factor of: $fraction")
}

我错过了什么吗?

答案摘要

截至目前,在将Java 8与Scala 2.11进行比较时,看起来Java HashMap在查找速度方面(对于少量密钥)的速度明显快于Scala产品 - 除了LongMap(如果你的密钥是Ints/Longs).

性能差异不是很大,在大多数用例中应该都很重要.希望Scala能够提高地图的速度.同时,如果您需要性能(使用非整数键),请使用Java.

Int键,n = 20
Long(60),Java(93),Open(170),MutableSc(243),ImmutableSc(317)

case对象键,n = 20
Java(195),AnyRef(230)



1> Rüdiger Klae..:

首先:使用nanoTime执行JVM基准测试非常容易出错.使用微基准测试框架,如百里香,卡尺或JMH

第二:您正在将可变的 Java哈希映射与不可变的 scala哈希映射进行比较.不可变集合可以非常快,但在某些情况下它们永远不会像可变数据结构那样快.

这是一个可变的java哈希映射与不可变的scala哈希映射的适当微基准测试:https://gist.github.com/rklaehn/26c277b2b5666ec4b372

如您所见,scala不可变映射比java可变映射快一点.请注意,一旦您转到较大的地图,情况就不会这样了,因为不可变数据结构必须做一些妥协才能实现结构共享.我猜想在这两种情况下,主要的性能问题是将整数加入整数.

更新:如果你真的想要一个带有int作为键的mutable hash hap,那么scala集合库中的正确选择就是scala.collection.mutable.LongMap.这使用long作为键,并且具有比通用Map更好的性能,因为它不必包装该值.查看要点的结果.

更新2:如果您的密钥从AnyRef扩展(例如String),那么高性能可变映射的最佳选择是scala.collection.mutable.AnyRefMap


你能解释和/或引用一个消息来源为什么使用`System.nanoTime()`是&#39;非常容易出错&#39;?
以下是关于依赖System.nanoTime()进行基准测试(以及一般JVM基准测试的困难)的陷阱的一个非常好的演示文稿:http://shipilev.net/blog/2014/nanotrusting-nanotime/
基本上问题是:你需要给JVM足够的时间来优化代码(所谓的预热),你需要确保基准测试没有完全优化.这就是基准方法必须始终返回结果的原因.

2> mohit..:

而不是调用applyie scalaMap(i),如果你这样做,scalaMap.get(i)那就快了javaMap.get(i)

从源代码来看,申请代码是

def apply(key: A): B = get(key) match {
    case NOne=> default(key)
    case Some(value) => value
  }

这表明apply方法首先调用该get方法,然后对其进行模式匹配.如果遇到option性能损失,每次调用都有一个额外的跳,并且已经在SO上讨论过了(虽然找不到链接)


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 第七章•Firewalld防火墙实战
    1、防火墙安全基本概述在CentOS7系统中集成了多款防火墙管理工具,默认启用的是firewalld(动态防火墙管理器)防火墙管理工具,Firewalld支持CLI(命令行)以及G ... [详细]
  • 【Rust日报】20221128 使用 Rust 编写解释型语言
    使用Rust编写解释型语言这是一本关于使用Rust来编写解释型语言的指导书.从理论基础,内存分配,真实实践,GC等方面循序渐进的指导如何使用Rust来编写解释型语言.原文链接:ht ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了Mycat水平分表相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 最近公司网络变更。原来的主机所在的网段也换成统一的了。svn服务主机地址对应也要修改。一直不喜欢用svn客户端,但是很少接触到更换地址的场景。今天刚好遇到了,顺带做个总结。(mac版 ... [详细]
author-avatar
多多智能锁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有