scalameter(https://scalameter.github.io/)는 마이크로 벤치마킹 기능을 가진 툴이다.  JVM warm up 또는 GC 의 영향을 받아 속도 체크가 좀 틀릴 수 있다. 이를 좀 막고 측정할 수 있는 라이브러리를 알게 되었다.


slideshare에 관련 자료가 잘 설명되어 있다. 


ScalaMeter 2014 from Aleksandar Prokopec







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 #




관련 소스는 다음과 같다.


https://github.com/scalameter/scalameter/blob/master/scalameter-core/src/main/scala/org/scalameter/Measurer.scala


Posted by '김용환'
,