Skip to content

Instantly share code, notes, and snippets.

@ryoppy
Last active December 14, 2015 00:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryoppy/5001432 to your computer and use it in GitHub Desktop.
Save ryoppy/5001432 to your computer and use it in GitHub Desktop.
ベンチマーク用Util。
package util
import compat.Platform
/**
* ベンチマーク用trait
*
* 継承して、loop(ループ回数, 実行するFunction) してあげると
* 指定回数実行して、結果がprintされる。
*
* [使い方]
* loop(10) { i =>
* // something...
* })
*
*/
trait Benchmark {
// 出力するか
var isPrint: Boolean = true
// 少数点の桁
var scale: Int = 5
/**
* ループして渡された関数を指定回数実行する。
*
* @param count ループ回数
* @param func 実行する関数
* @param isPrint printするかどうか
*/
def loop(count: Int)(func: Int => Any): BenchmarkResultSet = {
val startTime = now
(1 to count) foreach { i =>
val startEach = now
printResult(i, func(i), now - startEach)
}
val endTime = now
val elapsedTime = endTime - startTime
val averageTime = calcAverageTime(count, elapsedTime)
val qps = calcQps(count, elapsedTime)
val resultSet = BenchmarkResultSet(count, startTime, endTime, elapsedTime, averageTime, qps)
printTotalResult(resultSet)
resultSet
}
/**
* 1こずつ結果をprintする。
*
* @param count
* @param result
* @param elapsedTime
*/
def printResult(count: Int, result: Any, elapsedTime: Long): Unit = {
if (isPrint) println("i=" + count + ", 返り値=" + result + ", " + "実行時間=" + elapsedTime + "ms")
}
/**
* 結果をprintする。
*
* @param resultSet
*/
def printTotalResult(resultSet: BenchmarkResultSet): Unit = {
if (isPrint) {
println("===== 結果 =====")
println("合計実行時間(ms) : " + resultSet.elapsedTime)
println("平均実行時間(ms) : " + resultSet.averageTime)
println("QPS : " + resultSet.qps)
}
}
/**
* QPSの計算する。
*
* @param count
* @param elapsedTime
*/
def calcQps(count: Int, elapsedTime: Long): BigDecimal = {
val elapsedSec = elapsedTime / 1000
if (elapsedSec <= 0) 0 else (BigDecimal(count) / BigDecimal(elapsedSec)).setScale(scale, BigDecimal.RoundingMode.FLOOR)
}
/**
* 平均何msか計算する。
*
* @param count
* @param elapsedTime
*/
def calcAverageTime(count: Int, elapsedTime: Long): BigDecimal = {
(BigDecimal(elapsedTime) / BigDecimal(count)).setScale(scale, BigDecimal.RoundingMode.FLOOR)
}
/**
* alias (もっといい方法があったりする?)
*/
def now(): Long = {
Platform.currentTime
}
}
/**
* ベンチ結果の結果セット
*/
case class BenchmarkResultSet(
count: Int, // 何回実行したか
startTime: Long, // 開始時間
endTime: Long, // 終了時間
elapsedTime: Long, // 経過時間
averageTime: BigDecimal, // 平均何msか
qps: BigDecimal // 1秒間何回実行したか
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment