Я не совсем уверен, как различные части вашего кода сочетаются друг с другом и взаимодействуют с Java, но вот что-то, что может работать с тем, как вы это описали.
Чтобы получить время выполнения фрагмента кода, есть основная функция под названием time
. Однако эта функция не возвращает время выполнения, а просто выводит его... Итак, если вы хотите записать это время в базу данных, нам нужно написать макрос для захвата как возвращаемого значения fun2
, так и времени, которое потребовалось для выполнения:
(defmacro time-execution
[& body]
`(let [s# (new java.io.StringWriter)]
(binding [*out* s#]
(hash-map :return (time ~@body)
:time (.replaceAll (str s#) "[^0-9\\.]" "")))))
Что делает этот макрос, так это привязывает стандартный вывод к Java StringWriter
, чтобы мы могли использовать его для хранения всего, что печатает функция time
. Чтобы вернуть как результат fun2
, так и время, которое потребовалось для выполнения, мы упаковываем два значения в хэш-карту (может быть и какая-то другая коллекция — позже мы ее деструктурируем). Обратите внимание, что код, выполнение которого мы синхронизируем, заключен в вызов time
, так что мы запускаем побочный эффект печати и фиксируем его в s#
. Наконец, .replaceAll
просто гарантирует, что мы извлекаем только фактическое числовое значение (в миллисекундах), поскольку time
печатает что-то вроде "Elapsed time: 0.014617 msecs"
.
Включив это в ваш код, нам нужно переписать sampleFunction
следующим образом:
(defn sampleFunction [sampleInput]
(let [{:keys [return time]} (time-execution (fun2 sampleInput))]
(logTime time)
(fun1 return)))
Мы просто деструктурируем хэш-карту, чтобы получить доступ как к возвращаемому значению fun2
, так и к времени, которое потребовалось для выполнения, затем мы регистрируем время выполнения, используя logTime
, и, наконец, мы заканчиваем вызовом fun1
для возвращаемого значения fun2
.
person
count orlok
schedule
04.07.2020