計算
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) 、元のカルツ関数と同じ関数の署名を持っていることに注意してください。つまり、同じパラメーターを受け入れ、同じ値を返すことに注意してください。これは、CALE(記録できる機能)に機能を追加するだけです。
CalcとTimeIT(calc)は、いつでも互いに置き換えることができます。
timeIt自体は、関数を受け入れ、関数を返すため、高次関数です。この例では、計算非同期関数を受け入れ、同じパラメーターを持つ関数とcalcとの戻り値を返します。
以下は、TimeIT関数の実装方法を示しています。
const timet = 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()callback( f(... nargs)})const timeit1 = timeit((t、err、res)=> console.log( `log:$ {err || res}が生成された後:$ {t}`))const calc =(x、y、z、callback)=> setimeout(()=> callback(null、x * y / z)calc( console.log(err || res))timeit1(calc)(18、7、3、(err、res)=> console.log(err || res))このtimeIt実装は、2つのパラメーターを受け入れます。
レポート:分析結果を生成するために関数が使用されます
F:非同期関数分析を行いたい
timeIt1は便利で実用的な機能であり、 console.logを使用して時間測定の結果を記録します。 reportパラメーターをより一般的なtimeIt関数に渡すことで定義します。
私たちは目標を達成しましたが、今ではtimeIt1で非同期関数を包むことができ、タイミングがあります。
timeit1(calc)(18、7、3、(err、res)=> console.log(err || res)))
一般的なtimeIt関数は、 reportコールバック関数と非同期関数を受信し、新しい非同期関数を返します。この非同期関数には、元の関数と同じパラメーターと戻り値があります。これを使用できます:
timeit((time、... result)=> // callback:log the time、asyncfunc)(パラメータ…、(... result)=> // async関数の結果)
次に、 timeItの実装に飛び込みましょう。 timeIt R.curryを使用してコーリル化されるため、 timeIt1のような一般的な関数を単純に生成できます。
この投稿でcoriculizationについて議論するつもりはありませんが、次のコードはcoriculizationの主な使用法を示しています。
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()callback(... args)レポート(t1 - t0、... args)}これは、元の関数が非同期に実行された後に呼び出される匿名関数(Lambda、Callbackとも呼ばれます)です。主な問題は、この関数には例外を処理するメカニズムがないことです。 callbackが例外をスローした場合、 reportが呼び出されることはありません。
このlambda関数にtry / catchを追加できますが、問題のルートはcallbackとreport 2つのvoid関数であり、関連付けられていないことです。 timeItには2つの継続( reportとcallback )が含まれています。 consoleの下で実行時間を記録するだけ、またはreportもcallbackも例外をスローしないことを確信している場合、すべては問題ありません。ただし、分析結果(いわゆる自動スケーリング)に基づいて何らかの動作を実行したい場合は、プログラムの継続シーケンスを強化および明確にする必要があります。
さて、この記事の完全な内容がすべての人の勉強と仕事に役立つことを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。