WSH JScript で、高精度に処理時間を計測する(Performance API)
はじめに
JScriptで、スクリプトの処理時間を計測するとき、
Date オブジェクトを使って計測することがありますが、これはミリ秒単位の精度です。
厳密な速度計測が不要であれば、ミリ秒もあれば事足りますが、
より精度の高いマイクロ秒単位が必要であれば、
Web API (Performance API) の Performance インターフェースを使います。
実装
計測対象の関数は、ここから拝借。
フィボナッチ数を出力する関数を作る - Qiita
function do_something() { var fib = function (n) { return n > 2 ? fib(n - 1) + fib(n - 2) : 1; }; fib(33); }
Performance インターフェースによる計測
JScript環境の、Performance インターフェースは、
JSON オブジェクト等と同様で、htmlfile オブジェクトから取得できます。
WSH.Quit(function() { try{ // Performance を取得 var htmlfile = WSH.CreateObject("htmlfile"); htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=Edge"/>'); var performance = htmlfile.parentWindow.performance; htmlfile.close(); // 計測 var startTime = performance.now(); do_something(); var endTime = performance.now(); // 結果 // 浮動小数が得られる。小数点以下が、マイクロ秒。 // (小数第1位までしか得られない?) WSH.Echo((endTime - startTime) + " ms"); } catch(e){ WSH.Echo(e.name + ":" + e.message); return -1; } return 0; }());
過去の手法
Date オブジェクトによる計測
WSH.Quit(function()
{
try{
// 計測
var startTime = new Date();
do_something();
var endTime = new Date();
// 結果(※ これでは、ミリ秒に丸められた結果しか得られない)
WSH.Echo((endTime.getTime() - startTime.getTime()) + " ms");
}
catch(e){
WSH.Echo(e.name + ":" + e.message);
return -1;
}
return 0;
}());
その他メモ
バッチコマンドの計測であれば、powershell の Measure-Command が手軽です。
powershell -c (Measure-Command { (ここに計測するコマンド) })