V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
muziling
V2EX  ›  Scala

集合类型 filter 后执行 foreach 的效率 比 foreach 里写 if 来的慢

  •  
  •   muziling · 2020-05-21 17:24:45 +08:00 · 2316 次点击
    这是一个创建于 1676 天前的主题,其中的信息可能已经有所发展或是发生改变。
    object test {
      def main(args: Array[String]): Unit = {
        def listTestD = (0 to 20000000).toList
        var l1 = System.currentTimeMillis()
        var sum = 0
        listTestD.foreach{x=> if (x%2==0) sum = x}
        println(System.currentTimeMillis()-l1)
        sum = 0
        l1 = System.currentTimeMillis()
        listTestD.filter(_%2==0).foreach(sum = _)
        println(System.currentTimeMillis()-l1)
      }
    }
    

    执行结果是: 17585, 21059 效率差 20%左右

    避免缓存,对掉两个 foreach

    object test {
      def main(args: Array[String]): Unit = {
        def listTestD = (0 to 20000000).toList
        var l1 = System.currentTimeMillis()
        var sum = 0
        listTestD.filter(_%2==0).foreach(sum = _)
        println(System.currentTimeMillis()-l1)
        sum = 0
        l1 = System.currentTimeMillis()
        listTestD.foreach{x=> if (x%2==0) sum = x}
        println(System.currentTimeMillis()-l1)
      }
    }
    

    执行结果是: 35082, 16201 效率差近 50%。

    如果 listTestD 存储一个对象的内容,效率是不是会差更大?

    2 条回复    2020-05-21 23:36:33 +08:00
    muziling
        1
    muziling  
    OP
       2020-05-21 17:38:38 +08:00
    补充: 代码是 .filter().foreach 两步链式 和 一次链式 foreach( if(filter 的条件) ) 的差异
    Tomotoes
        2
    Tomotoes  
       2020-05-21 23:36:33 +08:00 via Android
    这不很明显嘛。。 两次 o ( n )与一次 o ( n )
    Scala 并不会优化这种主动的链式调用。
    建议换 Kotlin + asSequence,不管你调用多少次,都优化成一次 o ( n )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2822 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:07 · PVG 20:07 · LAX 04:07 · JFK 07:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.