classdef elapsedtimer < handle
%
% Print elapsed time and extrapolate remaining time of a lengthy
% computation. Smarter than tic and toc, but not as complex as the Matlab
% timer class. Currently there can be only one elapsedtimer running.
%
% Easiest:
% Before computation: etimer = elapsedtimer;
% At each step: steptimer(etimer);
%
% Print only every nth step, when computation has many steps, or steps are short:
% Before computation: etimer = elapsedtimer(n);
%
% When we know there will be 100 steps and we want remaining time displayed:
% Before computation: etimer = elapsedtimer([],100);
%
% If there are 100 steps but we only want to print every 10th:
% Before computation: etimer = elapsedtimer(10,100);
%
% Matt Caywood
% version 0.1: published 2010.07.20
% version 0.2: made object-oriented, simplified calling 2010.07.29
% version 0.21: fixed initialization bugs
properties (SetAccess = private)
tstart = 0;
step = 0;
totalsteps = 0;
modulo = 1;
end
methods
function etimer = elapsedtimer(modulo,totalsteps)
if exist('totalsteps','var'), etimer.totalsteps = totalsteps; else etimer.totalsteps = 0; end
if exist('modulo','var') && ~isempty(modulo), etimer.modulo = modulo; else etimer.modulo = 1; end
etimer.tstart = now;
etimer.step = 0;
end
function steptimer(etimer)
etimer.step = etimer.step + 1;
if mod(etimer.step,etimer.modulo) == 0
tnow = now;
telapsed = tnow - etimer.tstart;
tstepmean = telapsed / etimer.step;
tremaining = tstepmean * max(0,etimer.totalsteps - etimer.step);
elapsedstr = datestr(telapsed,13);
stepmeanstr = datestr(tstepmean,13);
if etimer.totalsteps > 0
remainingstr = datestr(tremaining,13);
fprintf('Elapsed time: %s Time per step: %s Time remaining: %s\n',elapsedstr,stepmeanstr,remainingstr);
else
fprintf('Elapsed time: %s Time per step: %s\n',elapsedstr,stepmeanstr);
end
end
end
end
end