Last active
December 14, 2015 00:49
-
-
Save ryoppy/5001432 to your computer and use it in GitHub Desktop.
ベンチマーク用Util。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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