scalameter(https://scalameter.github.io/)는 마이크로 벤치마킹 기능을 가진 툴이다. JVM warm up 또는 GC 의 영향을 받아 속도 체크가 좀 틀릴 수 있다. 이를 좀 막고 측정할 수 있는 라이브러리를 알게 되었다.
slideshare에 관련 자료가 잘 설명되어 있다.
sbt 설정에 다음 라이브러리를 추가한다.
"com.storm-enroute" %% "scalameter-core" % "0.7"
(!!! 0.6에는 라이브러리가 많이 없으니 최신 버전을 활용하는 것이 좋다)
sbt console을 사용해서 scalameter를 임포트한다.
scala> import org.scalameter._
jvm warm up 관련해서 메모리 초기화로 인해서 결과 값이 달라지지 않게 하니 적당히 잘 나온다.
scala> withWarmer(new Warmer.Default) measure { (0 until 100000).toArray }
res28: Double = 0.688856
scala> withWarmer(new Warmer.Default) measure { (0 until 100000).toArray }
res29: Double = 0.689882
scala> withWarmer(new Warmer.Default) measure { (0 until 100000).toArray }
res30: Double = 0.684432
scala> withWarmer(new Warmer.Default) measure { (0 until 100000).toArray }
res31: Double = 0.681093
scala> withWarmer(new Warmer.Default) measure { (0 until 100000).toArray }
res32: Double = 0.678273
scala> withWarmer(new Warmer.Default) measure { (0 until 100000).toArray }
res33: Double = 0.671677
scala> withWarmer(new Warmer.Default) measure { (0 until 100000).toArray }
res34: Double = 0.695395
메모리 정보도 확인할 수 있다.
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res9: Double = 399.656
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res10: Double = 400.016
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res11: Double = 399.656
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res12: Double = 400.016
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res13: Double = 399.656
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res14: Double = 399.656
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res15: Double = 400.016
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res16: Double = 399.656
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res17: Double = 397.08
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res18: Double = 400.016
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res19: Double = 399.656
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res20: Double = 400.016
scala> withMeasurer(new Measurer.MemoryFootprint) measure { (0 until 100000).toArray }
res21: Double = 397.568
GC 정보는 다음과 같이 테스트할 수 있다.
scala> withMeasurer(new Measurer.GarbageCollectionCycles, Aggregator.median[Int]) measure { (0 until 9999000).toArray }
res5: org.scalameter.Quantity[Int] = 2 #
scala> withMeasurer(new Measurer.GarbageCollectionCycles, Aggregator.median[Int]) measure { (0 until 9999000).toArray }
res6: org.scalameter.Quantity[Int] = 2 #
scala> withMeasurer(new Measurer.GarbageCollectionCycles, Aggregator.median[Int]) measure { (0 until 9999000).toArray }
res7: org.scalameter.Quantity[Int] = 2 #
scala> withMeasurer(new Measurer.GarbageCollectionCycles, Aggregator.median[Int]) measure { (0 until 9999000).toArray }
res8: org.scalameter.Quantity[Int] = 2 #
관련 소스는 다음과 같다.
'scala' 카테고리의 다른 글
[scala] 병렬 콜렉션 (par collection) (0) | 2017.07.24 |
---|---|
[scala] foldLeft, fodRight, reduceLeft, reduceRight, scanLeft, scanRight 함수 예제 (0) | 2017.07.24 |
[scala] 콘솔에서 코드 붙여서 테스트하기 (paste) (0) | 2017.07.21 |
[scala] DynamicVariable 예제 (0) | 2017.07.07 |
[scala] 변수를 사용하기 위한 underscore (0) | 2017.07.05 |