On Tue, Nov 14, 2023 at 05:47:24PM +0800, Qian Yun wrote:
>
>
> On 11/14/23 06:42, Waldek Hebisch wrote:
> > On Sun, Nov 05, 2023 at 10:28:38AM +0800, Qian Yun wrote:
> > > I introduce a new variable "roundingError", its valued was mistakenly
> > > added to the 'other' class, later it was added to "total" again,
> > > causing duplication. So I change it to only add to
> > > the 'other' named stat.
> > >
> > > The comparison "if n >= 0.01" is wrong, since we take 2 digits
> > > accuracy, so it should compare against 0.005, see "significantStat".
> > > Also "roundStat" is totally useless because it rounds to the third
> > > digit. We can rely on "FORMAT" to do the rounding.
> >
> > I suspect that intent of "if n >= 0.01" is different than you think.
> > Namely, small statistics are likely to have significant error
> > so it makes sense to supress printing of info for small classes.
> > I other words, it make sense to have treshold which is bigger
> > than treshold for rounding to 0.
>
> How about we do no rounding at all, and print 3 digits (or more, see
> following) after decimal point, and let user to decide if the last
> digit is to be trusted.
Well, as you noted FORMAT will do rounding to specified precision.
_If_ small values have significant error, then it makes sense to
supress printing of such values (except for total): printout
is less cluttered and user that cares about specific class will need
longer time to get meaningful result.
> > AFAICS original code is first computing long statistics and if non-long
> > statistics are desired it throws out computed result and starts again.
> > It would make sense to have common code which just computes desired
> > statistics.
>
> I can do this improvement.
>
> > Also, before your recent changes long format skipped "other" class
> > when corresponding time would print as 0 (or maybe was small). Now
> > it is:
> >
> > Time: 0.02(evaluation) + 0.00(other) = 0.03 sec
>
> This happened before as well (when the number is less than 0.005):
>
> Time: 0.00(O) = 0.00 sec
Maybe this happened sometime. But I obtained:
Time: 0.02(E) = 0.02 sec
from old code and result with "0.00(other)" using new code. I think
we should supress printing of "0.00" time except for total. Old code tried
to replace "0.00" by "0" but as you show it failed at least in some
cases.
> > One more thing: did you try to get more accurate timing? In different
> > context I have found useful microsecond timings: al least on Linux it
> > is possible to measure real time taken be a routine with microsecond
> > accuracy. I am not sure how much accuracy one can get from Lisp
> > routines, but IIRC Clozure CL reports time with microsecond resolution.
>
> The timing accuracy is determined by $timerTicksPerSecond which is
> INTERNAL-TIME-UNITS-PER-SECOND in Lisp:
>
> GCL: 100
> CLISP: 1000000 (windows: 10^7)
> ECL: 1000000
> SBCL: 1000000 (x86: 1000)
> CMUCL: 100
> CCL: 1000000 (x86: 1000)
> ABCL: 1000
Well, that is resolution of the result. But accuracy may
be lower and question is if we get accuracy significantly better
than 2 digits.
> So that's probably why we were printing 2 digits in the past.
> (And Lisps have lower accuracy due to 32-bit limitation.)
> If that's the case, then the whole rounding logic did nothing
> in the GCL era.
>
> Shall we make it configurable how many digits to be printed?
Probably. Even if accuracy is low it make sense to have somewhat
higher resolution of the result simply to avoid extra error due
to rounding. And if system can deliver better accuracy it is
silly to loose accuracy by rounding to 2 digits. OTOH people
will mostly look at time when it is long and for long times
2 digits after dot are enough.
--
Waldek Hebisch