On Mar 19, 5:58 am, Peter Szinek <p... / rubyrailways.com> wrote:
> Just to make sure I am not reinventing the wheel(tm) again: is there a
> function/lib in Ruby which computes average of timespans? e.g.
>
> first task took    1s:100ms
> second task took   1s:400ms
> third task took    3s:500ms
>                     --------
> average            2s:000ms

The Benchmark class lists an example of doing this for a fixed set of
discrete known tasks:

         require 'benchmark'

         n = 50000
         Benchmark.benchmark(" "*7 + CAPTION, 7, FMTSTR, ">total:",
">avg:") do |x|
           tf = x.report("for:")   { for i in 1..n; a = "1"; end }
           tt = x.report("times:") { n.times do   ; a = "1"; end }
           tu = x.report("upto:")  { 1.upto(n) do ; a = "1"; end }
           [tf+tt+tu, (tf+tt+tu)/3]
         end

     The result:

                       user     system      total        real
          for:     1.016667   0.016667   1.033333 (  0.485749)
          times:   1.450000   0.016667   1.466667 (  0.681367)
          upto:    1.533333   0.000000   1.533333 (  0.722166)
          >total:  4.000000   0.033333   4.033333 (  1.889282)
          >avg:    1.333333   0.011111   1.344444 (  0.629761)

It would also be pretty easy to modify the Benchmark.bmbm method to do
this. Just sum and average the results calculated on line 277:
      res = Benchmark::measure(&item)


A side note: if you have a never-ending sequence of 'tasks' (such as a
task repeated every update frame in a renderer) it is easier to
calculate - and sometimes more desirable - to use a low-pass filter
rather than a running average on a circular- or windowed-list.

For example:
avg_task_time += ( current_task_time - avg_task_time ) / inertia

The higher the 'inertia', the less the formula will react to
measurement spikes and the longer it will take to reach a new average.
The closer 'inertia' is to zero, the quicker it will react to changes.