SBT до / после хуков для задачи

(сохранил отсюда)

Я пытаюсь измерить / записать время выполнения задачи.

Я рассмотрел "обертывание" задачи, добавив одну задачу до и одну задачу после, но это не будет работать каждый раз, так как sbt гарантирует только частичный порядок.

Лучшая упаковка будет выглядеть примерно так:

wrappedTask := {
  startMeasuringTime()
  somehowInvoke(myTaskKey in SomeContext)
  endMeasuringTime()
}

Каким должен быть этот "каким-то образом" вызов?

1 ответ

Решение

Измерение времени, затраченного на задачу, нуждается в поддержке со стороны исполнителя задачи. Как вы подразумеваете, вы не можете сделать это только с помощью примитивов задачи. Я отправил некоторый пример кода, который я написал некоторое время назад, который показывает идею.

Сложность, с которой примерный код не обрабатывает, состоит в том, что то, что пользователь концептуально рассматривает как одну задачу (например, компиляцию), может фактически быть реализовано как несколько задач, и эти временные параметры должны быть объединены. Кроме того, такая задача, как internalDependencyClasspath "вызывает" другие задачи (flatMap), поэтому время его выполнения включает в себя время выполнения "вызываемых" задач.

РЕДАКТИРОВАТЬ: Это было реализовано для 0.13.0 в качестве экспериментальной функции в 602c1759a1885 и 1cc2f57e158389759. Интерфейс ExecuteProgress предоставляет достаточную информацию, чтобы описанные выше проблемы не являлись проблемой.

Другие вопросы по тегам