muziling
V2EX  ›  Scala

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

  •  
  •   muziling · May 21, 2020 · 5496 views
    This topic created in 2182 days ago, the information mentioned may be changed or developed.
    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 replies    2020-05-21 23:36:33 +08:00
    muziling
        1
    muziling  
    OP
       May 21, 2020
    补充: 代码是 .filter().foreach 两步链式 和 一次链式 foreach( if(filter 的条件) ) 的差异
    J0G57faC6uPo75W0
        2
    J0G57faC6uPo75W0  
       May 21, 2020 via Android
    这不很明显嘛。。 两次 o ( n )与一次 o ( n )
    Scala 并不会优化这种主动的链式调用。
    建议换 Kotlin + asSequence,不管你调用多少次,都优化成一次 o ( n )
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   929 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 21:21 · PVG 05:21 · LAX 14:21 · JFK 17:21
    ♥ Do have faith in what you're doing.