ホーム ] アプリ ] クイックソートライブラリ ] グリッドコントロール ] EXIF情報ライブラリ ] 実行時間計測ラブラリ ] 多倍長演算ライブラリ ] 多倍長演算ライブラリU ] 画像処理ライブラリ ]

上へ
パフォーマンスカウンタ
時間計測の解析
計測技術

技術解説

計測技術

最終更新日:2007/04/13  全面改訂

●概要

 測定に混入する誤差を小さくしたり、バラツキを押さえた測定技術について考察する。

●誤差を小さくする

 オーバーヘッドは0にはできないので、真値に比べオーバーヘッドを小さくすることが現実的な解となる。例えば、1nS の事象を、500pS 掛かるループ制御で何回かループさせて測定すれば、50%の誤差となってしまう。また、ループさせることは必要なことで、例えば、明らかに測定分解能以下の事象であればループせざるを得ない。このような場合は、以下のように、ループの代わりに、同じコードを書き下ろして実行させる。

 t を XXXXX の実行時間真値とすれば、

  For i = 0 To N - 1
     XXXXX
  Next

 →測定値 T = ( t + to) * N     (toはループ処理オーバーヘッド時間)

の代わりに、

  XXXXX
    XXXXX
    XXXXX
    ・・・・・・
    ・・・・・・
   XXXXX

 →測定値 T =  t * N

と、同じコードをN回実行する。これで、測定値 T は、真値に比例する。また、

 測定分解能 ≪ t * N

の条件が必要となる。分解能誤差は、一般に量子化されるので、M = 真値 \ 分解能 とすれば、誤差は、

 分解能誤差 = 1 / M

となる。つまり、M が大きければ大きいほど誤差は小さくなる。当然、真値 < 分解能では、誤差は無限大になる。

 この誤差を5%程度にしたいなら、M = 20 つまり、分解能の20倍以上の事象を計測すれば良いと分かる。同じコードを書き下ろす回数にも限度があるので、書き下ろした部分の時間が、ループ処理のオーバーヘッドより十分大きくなれば、それをループしても良い。

●システムオーバーヘッドの影響を小さくする

 もうお分かりと思うが、測定分解能がいくら小さくても、このシステムオーバーヘッドがあるので、喜んではいけない。

 今、システム周期をt、カーネル平均処理時間をtk、測定時間をTmとすれば、真値をTとすれば、

 Tm = T + K * tk

 Kは、測定中に起こったシステム割り込み回数で、

 K = Tm \ t  

となる。従って、

 Tm = T + (Tm \ t) * tk

となる。ところで、Tm \ t は、量子数なので、0、1、2・・・・となるが、Tm ≦ t では、0 or 1 となる。これは、システム割込みが、いかなる場合でも起こる可能性があるからで、この状態で 1となれば、Tm = T + tk となる。もし、 T ≒ tk であれば、Tm = 2 * tk と、誤差が100%となる。システム割込み回数が比較的小さいところでは、このように量子化誤差が大きくなるし、バラツキも大きくなる。

 今、Tm ≫ t とすれば、量子数は線形化できるので、

   Tm = T + (Tm / t) * tk
        = T + Tm * (t / tk)

とできる。整理すると、

   Tm = t / (t - tk) * T

誤差率を算出すると、

 誤差率 = (Tm - T) / T
             = t /(t - tk) - 1
             = tk / (t - tk)

と概ね一定になる。バラツキも問題なので、算出すれば、

  バラツキ = 1 / K

となる。結局、システムオーバーヘッドの対策は、無限回の割り込みでも、誤差は、tk / (t - tk) より小さくならない、しかし、バラツキは0にできる。常識的な値として、バラツキを10% 程度にしたければ、K = 10 以上とすればよい。つまり、システム周期が50mSであれば、0.5秒間は測定することになる。tkをエイヤッと、200μSとすれば、誤差率は、約4%になる。