一些简单的scala代码中的奇怪速度下降

时间:2018-11-09 18:59:21

标签: scala

我正在处理本质上(谁,在哪里,多少)的大量记录(CDRS),以节省空间,我使用查找将字符串映射为整数并将流量聚集在map上(谁映射到地图(其中映射了多少)

type CDR      = (String, String, Int)
type Lookup   = scala.collection.mutable.HashMap[String, (Int, Float)]
type Traffic  = scala.collection.mutable.HashMap[Int,scala.collection.mutable.HashMap[Int,Int]]enter code here

我发现了一个奇怪的行为,当我预先构建查找表时,代码会按预期运行,但是当我开始处理并即时构建地图时,它会在处理记录时变慢。

我使用相同的功能来建立查找表以进行比较。我基本上检查查找代码是否存在,如果没有,则创建一个新条目(它是可变映射),如下所示:

def index(id: String, map: Lookup, reverse: Reverse): Int = {
    if (map.contains(id)) {
        map(id)._1
    } else {
        val number = if (map.keys.size == 0) 0 else reverse.keys.max + 1
        reverse += ( number -> id)
        map += (id -> (number, 0.toFloat))
        number   
    }
}

我在这里错过了什么吗? 编辑---->我不再能重现减速情况。我会认为我比平时太累或太笨了。现在的运行时间似乎与我预期的相同。

1 个答案:

答案 0 :(得分:1)

什么是mapCellRvs?默认标量Map的{​​{1}}(和.size,这是同一件事)只是通过线性扫描所有元素来计数它们。

尝试将.keys.size替换为mapCellRvs.keys.size == 0 ...

此外,mapCellRvs.isEmpty也是线性的。您可能只想单独记住某个最大值,而不是每次都计算它。