2014-11-27 2 views
2

불변에 호출 변경 가능한지도 스칼라의 .MAP() 함수

  • 에 호출

    1. 빨라집니다 큰 길이의지도에 .map()를 호출 할 때
    2. 지도 아니면 차이
  • +2

    왜 측정하지 않으시겠습니까? – rightfold

    답변

    5

    은 그냥 그것을 확인하자하지 않습니다 (물론, 마이크로 벤치 마크 결과는 항상 에누리주의해야한다). Scalameter를 사용

    :

    // build.sbt 
    
    scalaVersion := "2.11.4" 
    
    libraryDependencies ++= Seq(
        "com.storm-enroute" %% "scalameter" % "0.6" 
    ) 
    
    // src/main/scala/main.scala 
    
    import org.scalameter.api._ 
    import scala.collection.immutable 
    import scala.collection.mutable 
    
    object RangeBenchmark extends PerformanceTest.Quickbenchmark { 
        val sizes = Gen.range("size")(100000, 500000, 100000) 
    
        val immutableMaps = for { 
        size <- sizes 
        } yield immutable.Map((0 until size).map(n => n -> (size-n)).toSeq: _*) 
    
        val mutableMaps = for { 
        size <- sizes 
        } yield mutable.Map((0 until size).map(n => n -> (size-n)).toSeq: _*) 
    
        performance of "immutable.Map" in { 
        measure method "map" in { 
         using(immutableMaps) in { m => m.map { case (k, v) => (k+1, v+1) } } 
        } 
        } 
    
        performance of "mutable.Map" in { 
        measure method "map" in { 
         using(mutableMaps) in { m => m.map { case (k, v) => (k+1, v+1) } } 
        } 
        } 
    } 
    

    이 실행 ( sbt run) :

    ... lots of output ... 
    
    ::Benchmark immutable.Map.map:: 
    cores: 4 
    jvm-name: OpenJDK 64-Bit Server VM 
    jvm-vendor: Oracle Corporation 
    jvm-version: 24.65-b04 
    os-arch: amd64 
    os-name: Linux 
    Parameters(size -> 100000): 40.95331 
    Parameters(size -> 200000): 90.12223 
    Parameters(size -> 300000): 139.716564 
    Parameters(size -> 400000): 208.114459 
    Parameters(size -> 500000): 254.876849 
    
    ... lots of output ... 
    
    ::Benchmark mutable.Map.map:: 
    cores: 4 
    jvm-name: OpenJDK 64-Bit Server VM 
    jvm-vendor: Oracle Corporation 
    jvm-version: 24.65-b04 
    os-arch: amd64 
    os-name: Linux 
    Parameters(size -> 100000): 24.004582 
    Parameters(size -> 200000): 52.941946 
    Parameters(size -> 300000): 66.036803 
    Parameters(size -> 400000): 113.575799 
    Parameters(size -> 500000): 119.544183 
    

    은 분명히, 변경 가능한 맵은 거의 정확하게 두 배 빠르다. 내 생각 엔지도 Builder s의 차이 때문에이 문제가 발생합니다. 추가 할 수있는 각 요소로 업데이트되는 불변지도 작성기는 var이며 변경 가능한지도 작성기는 변경 가능한지도 자체입니다. 결과적으로 맵 크기가 클 경우 불변 맵 빌더가 더 많은 할당을 발생시킵니다. 이것은 정말로 야생의 추측입니다. 그래서 더 많은 지식을 가진 사람이 정확한 이유를 제시 할 것입니다.