|
|
●解説 それなりに正確に計測するには、対象となる処理部分(関数やサブルーティン)を有限の時間以上になるように繰り返さないといけない。 しかし、計る対象が不明なので、ループ数は最初、試行錯誤で、後で実測値から算出して修正することになり、全く面倒くさい。しかも、これらは、CPU、OS、処理ルーティン(の改良)などにより、複雑に変化する。 今回、未知なる対象の未知なる最適な測定時間を自動的に見つけ出し、最適な計測条件で計測する方法を紹介する。 但し、この方法では、純粋のプロセス時間ではなく、システムが消費する時間も含まれる。しかし、現実に体感する処理時間はそう言う環境での時間なので間違っている訳ではない。 →この新版としてMeasureTimeライブラリを提供している。 ●原理 ・計測対象をブラックボックス化するために、コールバック関数とし、処理の一元化(モジュール化)を計る。 ・以下のロジックで、最適測定時間を自動的に得て、測定する。
●方法と実例 ○コールバック関数 測定対象をコールバック関数にしておけば、測定ロジックは一般化でき、モジュールとできる。このため、必要なら被測定関数群をコールバックテーブルにして置く。これにて、測定側は、ループ処理で行える。但し、コールバックは手続きに時間がかかるので、コールバックの外で時間を計測すると、誤差が大きくなる。そこで、コールバック関数内で時間計測する。以下の例を参照。 AnyCB(ByRef T As Double, ByRef C As
Long) ○定義と一覧表 ・コールバック関数は、以下のように定義する。 引数は必要に応じて変更する。パターンに応じて複数定義しても良い Friend Delegate Sub CBFunction(ByRef T As Double, ByRef C As Long) ・以下のように、予め、測定したい関数を配列にして置く。 Dim CBT(20) As CBFunction 'コールバック関数一覧 CBT(0) = AddressOf
AnyCBa '測定したい実際の関数a あるいは、以下の例のように静的に生成しても良い。 Dim CBT() As CBFunction = {AddressOf CBPIM, AddressOf CBPIG, AddressOf CBE} ・計測 FullAutoMeasure が、全自動測定モジュール 以下を、i にて、必要分処理する。 LC = 1 もし、単独ならば、 Dim Sec2 As Double =2000000000 '2秒をnsで表現したもの Friend Sub
FullAutoMeasure(ByVal CB As CBFunction,
ByRef T As Double, ByRef C As Long) ●感想 測定時間自体は少し余計に掛かるが、ループ回数テーブルの修正時間がないので、トータルとしては、頗る早くなった。未知の対象でも、何もしないで正確に測定してくれる。1ns以下になる、CPU演算時間も計測できることを確認した。
|