계산
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 : time : $ {t1 = t0}`) console.log (err || res)}) 그러나 이것은 재사용 가능한 솔루션이 아닙니다. 기능을 시간에 시간을 가질 때마다 외부 스코프에 T0을 소개하고 callback 변경하여 시간을 측정하고 기록해야합니다.
나에게 이상적인 방법은 비동기 기능을 감싸는 것만으로 시간을 가질 수 있다는 것입니다.
timeit (calc) (arg, (err, res) => console.log (err || res))
timeIt 각 비동기 기능에 대해 분석 및 실행 시간을 기록 할 수 있어야합니다.
timeIt(calc) 는 원래 Calc 함수와 동일한 함수 서명, 즉 동일한 매개 변수를 허용하고 동일한 값을 반환하면 Cale에 기능을 추가합니다 (녹음 시간).
Calc and Timeit (calc)은 언제든지 서로 대체 할 수 있습니다.
timeIt 자체는 함수를 수락하고 함수를 반환하기 때문에 고차 기능입니다. 이 예에서는 Calc Asynchronous 함수를 수용하고 동일한 매개 변수를 가진 함수를 반환하고 calc와 반환 값을 반환합니다.
다음은 시간 기능을 구현하는 방법을 보여줍니다.
const timeit = r.curry ((report, f) => (... args) => {const t0 = date.now () const nargs = r.init (args) const callback = r.last (args) nargs.push ((... args) => {const t1 = date.now () 콜백 (... args) report (... Args)))))))))))))))))))))))))))))))))))))))))))})})}))})})})})})})})}). timeit1 = timeit ((t, err, res) => console.log (`log : $ {err || res}는 다음과 같은 후 생성됩니다 : $ {t}`)) const calc = (x, y, z, 콜백) => settimeout (() => Callback (null, x * y / z), 1000) calc (18, 7, 3, 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 ((시간, ... 결과) => // 보고서 콜백 : 시간을 로그, Asyncfunc) (매개 변수…, (... result) => // 비동기 함수의 결과)
이제 timeIt 의 구현에 뛰어 들어 봅시다. timeIt R.curry 사용하여 코리를 만들기 때문에 timeIt1 과 같은 일반적인 기능을 단순히 생성 할 수 있습니다.
나는이 게시물에서 coriculization에 대해 논의 할 계획이 없지만 다음 코드는 coriculization의 주요 사용법을 보여줍니다.
const f = r.curry ((x, y) => x + y) f (1, 10) // == 11f (1) (10) // == 11 Const plus1 = f (1) plus1 (10) // == 11
반면에 TimeIT에 이런 식으로 구현 된 몇 가지 문제가 있습니다.
(... args) => {const t1 = date.now () 콜백 (... args) 보고서 (T1`T0, ... Args)} 원래 함수가 비동기 적으로 실행 된 후 호출되는 익명 함수 (Lambda, Callback)입니다. 주요 문제는이 기능에 예외를 처리 할 메커니즘이 없다는 것입니다. callback 예외를 던지면 report 호출되지 않습니다.
우리는이 lambda 함수에 try / catch 추가 할 수 있지만, 문제의 근본은 callback 과 report 가 두 개의 void 함수이며 관련이 없다는 것입니다. timeIt 에는 두 가지 연속이 포함되어 있습니다 ( report 및 callback ). console 에서 실행 시간을 기록하거나 report 나 callback 예외를 제외하지 않을 것이라고 확신하면 모든 것이 정상입니다. 그러나 분석 결과 (소위 자동 스케일링)를 기반으로 일부 동작을 수행하려면 프로그램의 연속 순서를 강화하고 명확하게해야합니다.
좋아,이 기사의 전체 내용이 모든 사람의 연구와 작업에 도움이되기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다.