У меня есть функция, чтобы вычислить время, проведенное в блоке:временных функций парадоксальных
import collection.mutable.{Map => MMap}
var timeTotalMap = MMap[String, Long]()
var numMap = MMap[String, Float]()
var averageMsMap = MMap[String, Float]()
def time[T](key: String)(block: =>T): T = {
val start = System.nanoTime()
val res = block
val total = System.nanoTime - start
timeTotalMap(key) = timeTotalMap.getOrElse(key, 0L) + total
numMap(key) = numMap.getOrElse(key, 0f) + 1
averageMsMap(key) = timeTotalMap(key)/1000000000f/numMap(key)
res
}
Я синхронизация функции и место, где она называется в одном месте.
time("outerpos") { intersectPos(a, b) }
и сама функция начинается с:
def intersectPos(p1: SPosition, p2: SPosition)(implicit unify: Option[Identifier] =None): SPosition
= time("innerpos") {(p1, p2) match {
...
}
Когда вывожу раз Нано для каждого ключа (timeTotalMap
), я получаю (добавлены пробелы для lisibility)
outerpos-> 37 870 034 714
innerpos-> 53 647 956
It означает, что общее время выполнения innerpos на 1000 меньше, чем у outpospos.
Что! между ними есть коэффициент 1000? И в нем говорится, что внешний вызов занимает в 1000 раз больше времени, чем все внутренние функции? я что-то упускаю или там где-то есть утечка памяти?
Update
Когда я сравниваю количество выполнения для каждого блока (numMap
), я нахожу следующее:
outerpos -> 362878
innerpos -> 21764
Это парадоксальное. Даже если intersectPos
вызывается где-то в другом месте, не должно ли количество раз, когда оно вызывается, так же велико, как количество раз, когда вызывается наружное слово?
EDIT
Если переместить линию numMap(key) = numMap.getOrElse(key, 0f) + 1
в верхней части времени functinon, то эти цифры становятся примерно равными.
Эти наносны в результатах? –
Вы не можете выполнять выбор времени таким образом и узнать что-нибудь от него. Это классическая ошибка микрообнаружения на JVM. Вы измеряете такие вещи, как время загрузки классов и компиляцию JIT (возможно, в зависимости от множества вещей). Существует два цикла обработки JVM-микробизнеса как в переполнении стека, так и в более крупной сети. Здесь нет смысла повторять это снова. –
@ RandallSchulz Хорошая точка в отношении микрообъектива –