Расчет
calc - это асинхронная функция, которую мы хотим сделать анализ (анализ производительности). По соглашению, его последний параметр - callback . Мы используем calc , как это:
Calc (arg, (err, res) => console.log (err || res)))
Возможно, самый простой способ проанализировать производительность в такой функции, как calc - добавить логику времени, где нам нужно проанализировать:
const t0 = date.now () calc (arg, (err, res) => {const t1 = date.now () console.log (`log: время: $ {t1 = t0}`) console.log (err || res)}) Однако это не многоразовое решение. Каждый раз, когда мы хотим сделать время функции, мы должны ввести T0 во внешнем объеме и изменить callback для измерения и записи времени.
Идеальный способ для меня - быть в состоянии времени на это, просто обернув асинхронную функцию:
timeit (calc) (arg, (err, res) => console.log (err || res)))
timeIt должен хорошо выполнять анализ и время выполнения выполнения для каждой асинхронной функции.
Обратите внимание, что timeIt(calc) имеет ту же сигнатуру функции, что и исходная функция CALC, то есть они принимают те же параметры и возвращают то же значение, она просто добавляет функцию в Cale (функция, которая может быть записано время).
Calc и Timeit (Calc) могут быть заменены друг другом в любое время.
Сам timeIt является функцией более высокого порядка, потому что он принимает функцию и возвращает функцию. В нашем примере он принимает асинхронную функцию Calc и возвращает функцию с теми же параметрами и возвращаемым значением, что и Calc.
Следующее показывает, как мы реализуем функцию Timeit:
const timeit = r.curry (((отчет, f) => (... args) => {const t0 = date.now () const nargs = r.init (args) const callback = r.last (args) nargs.push (... args) => {const t1 = date.now (). f (... nargs)}) const timeit1 = timeit ((t, err, res) => console.log (`log: $ {err || res}, произведенные после: $ {t}`)) const calc = (x, y, z, allback) => settimeout (() => wallback (null, x * y / z), 1000). console.log (err || res)) timeit1 (calc) (18, 7, 3, (err, res) => console.log (err || res))) Эта реализация timeIt принимает два параметра:
Отчет: функция используется для получения результатов анализа
F: Асинхронная функция мы хотим сделать анализ
timeIt1 - это удобная и практическая функция, он просто использует console.log для записи результатов измерения времени. Мы определяем его, передавая параметр report в более общую функцию timeIt .
Мы достигли цели, и теперь мы можем просто обернуть асинхронную функцию в timeIt1 и время, когда она поставлена:
Timeit1 (Calc) (18, 7, 3, (err, res) => console.log (err || res)))
Общая функция timeIt получает функцию обратного вызова report и асинхронную функцию и возвращает новую асинхронную функцию. Эта асинхронная функция имеет те же параметры и возвращаемое значение, что и исходная функция. Мы можем использовать это:
TimeIt ((время, ... результат) => // Отчет о обращении: войдите время, асинкфунк) (параметры…, (... результат) => // Результат асинхронной функции)
Теперь давайте погрузимся в реализацию timeIt . Мы можем просто генерировать общую функцию, такую как timeIt1 , потому что timeIt корилируется с использованием R.curry .
Я не планирую обсуждать корикуляцию в этом посте, но следующий код демонстрирует основное использование корикуляции:
const f = r.curry ((x, y) => x + y) f (1, 10) // == 11f (1) (10) // == 11const plus1 = f (1) plus1 (10) // == 11
С другой стороны, есть несколько проблем с реализацией Timeit таким образом:
(... args) => {const t1 = date.now () обратный вызов (... args) отчет (t1 ― t0, ... args)}}}} Это анонимная функция (также известная как Lambda, обратный вызов), которая называется после того, как исходная функция выполняется асинхронно. Основная проблема заключается в том, что эта функция не имеет механизма для обработки исключений. Если callback бросает исключение, report никогда не будет вызван.
Мы можем добавить эту функцию try / catch к этой функции lambda , но корень проблемы в том, что callback и report являются двумя функциями void , и они не связаны. timeIt содержит две продолжения ( report и callback ). Если мы просто записываем время исполнения под console или если мы уверены, что ни report , ни callback не вызовут исключения, то все в порядке. Но если мы хотим выполнить какое-то поведение на основе результатов анализа (так называемое автоматическое масштабирование), нам необходимо укрепить и прояснить последовательность продолжения в нашей программе.
Хорошо, я надеюсь, что полное содержание этой статьи будет полезно для каждого обучения и работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения.