くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

TypeScriptのデコレータで関数の実行時間を計測する

作っているWebサービスの性能改善のため、
どれくらい時間がかかるかを計測したいと思ったときの備忘録。

この記事をみると、デコレータでできる感じだったのでためしてみた。

こんな感じで時間を測りたい関数に@measureLogをつけるだけでログに表示してくれるように。

@measureLog
function foo() {
//...
}

時間を計測するデコレータ

デコレータの本体はこんな感じ。

export function measureLog(target: any, propKey: string, descriptor: PropertyDescriptor) {

  // 対象の関数を取得
  const original = descriptor.value;
  
  // 計測処理を含めた関数をラップ
  descriptor.value = function() {
    const key = `measureLog_${target.constructor.name}#${propKey}`;
    
    // 計測開始
    console.time(key);
    
    // リフレクションで対象関数を実行
    const ret = Reflect.apply(original, this, arguments);
    
    // 対象関数の返り値がPromiseなら、結果が帰ってくるまで待つ
    if (ret instanceof Promise) {
      return ret.then((ret) => {
        console.timeEnd(key);
        return ret;
      });
    } else {
      console.timeEnd(key);
    }
    return ret;
  };
}

以上!! デコレータ便利...(´ω`)

参考にしたサイト様