On Apr 16, 2013, at 7:50 PM, Eliot Miranda wrote:

> 
> 
> On Tue, Apr 16, 2013 at 2:56 AM, Igor Stasenko <siguc...@gmail.com> wrote:
> On 16 April 2013 11:32, Henrik Johansen <henrik.s.johan...@veloxit.no> wrote:
> >
> > On Apr 15, 2013, at 4:50 PM, Igor Stasenko wrote:
> >
> >> On 15 April 2013 16:43, Igor Stasenko <siguc...@gmail.com> wrote:
> >>> On 15 April 2013 16:32, Henrik Johansen <henrik.s.johan...@veloxit.no> 
> >>> wrote:
> >>>>
> >>>> On Apr 15, 2013, at 3:25 PM, Igor Stasenko wrote:
> >>>>
> >>>>> On 15 April 2013 12:14, Henrik Johansen <henrik.s.johan...@veloxit.no> 
> >>>>> wrote:
> >>>>>>
> >>>>>> On Apr 13, 2013, at 12:16 AM, Igor Stasenko wrote:
> >>>>>>
> >>>>>>>
> >>>>>>> But that's fine.. now look at
> >>>>>>>
> >>>>>>> secondsWhenClockTicks
> >>>>>>>
> >>>>>>>     "waits for the moment when a new second begins"
> >>>>>>>
> >>>>>>>     | lastSecond |
> >>>>>>>
> >>>>>>>     lastSecond := self primSecondsClock.
> >>>>>>>     [ lastSecond = self primSecondsClock ] whileTrue: [ (Delay
> >>>>>>> forMilliseconds: 1) wait ].
> >>>>>>>
> >>>>>>>     ^ lastSecond + 1
> >>>>>>>
> >>>>>>> that is complete nonsense. Sorry.
> >>>>>>>
> >>>>>>> This code relying on primSecondsClock resolution, which is..... (drum
> >>>>>>> roll..... )
> >>>>>>> 1 second..
> >>>>>>>
> >>>>>>> then it is combined with millisecondClockValue , as you see later to 
> >>>>>>> get
> >>>>>>> system time with millisecond precision..
> >>>>>>>
> >>>>>>> I am not genius in math and physics.. but even i understand that if
> >>>>>>> you measurement has error X
> >>>>>>> you cannot get more precision than X, even if you combine it with
> >>>>>>> another measurement with higher precision.
> >>>>>>>
> >>>>>>> (But i can be wrong with that.. if so, please explain why)
> >>>>>>
> >>>>>> Because, as Levente said in code, resolution  != accuracy.
> >>>>>> When you measure a single sample, sure, that value has an error of max 
> >>>>>> resolution / 2.
> >>>>>> But when you measure when that value _changes_, you have an error of 
> >>>>>> the underlying accuracy / 2.
> >>>>>> Clock s value:                  1               2
> >>>>>> resolution:                     |_______|_______|
> >>>>>> accuracy:                       |||||||||||||||||||||||||||||||||||
> >>>>>>                                                        ^
> >>>>>> Here's to hoping the above ascii art(?) worked!
> >>>>>>
> >>>>>> So no, that method is not complete nonsense.
> >>>>>>
> >>>>> Okay.
> >>>>> Now i rewriting the code which uses new primitive 
> >>>>> (primUTCMicrosecondClock),
> >>>>> and then we will no longer need this startup logic nor wrap around
> >>>>> check & other gory details...
> >>>>> just use a primitive.
> >>>>
> >>>> Sounds clearer, yes.
> >>>>
> >>>> However, be aware, at least on my VM:
> >>>> [Time millisecondClockValue] bench '34,600,000 per second.'
> >>>> [Time primUTCMicrosecondClock] bench '12,400,000 per second.'
> >>>>
> >>>> Which in my case translated to that in a Time2 class with #now defined:
> >>>> now
> >>>>
> >>>>        | microSecondsToday |
> >>>>        microSecondsToday := self primUTCMicrosecondClock \\ 86400000000.
> >>>>        ^ self seconds: microSecondsToday // 1000000 nanoSeconds: 
> >>>> microSecondsToday * 1000
> >>>>
> >>>> and changing the relatively low-hanging fruit in standard Time (removing 
> >>>> Duration creation and other crap):
> >>>>
> >>>> seconds: seconds nanoSeconds: nanoCount
> >>>>        "Answer a Time from midnight."
> >>>>
> >>>>        ^ self basicNew
> >>>>                seconds: seconds nanoSeconds: nanoCount
> >>>>
> >>>> To benchmarks that looked like this:
> >>>> "Old code"
> >>>> [Time now ] bench '7,330,000 per second.' '7,280,000 per second.' 
> >>>> '7,170,000 per second.'
> >>>> "Using microsecondClock every call"
> >>>> [Time2 now ] bench  '2,280,000 per second.''2,300,000 per second.' 
> >>>> '2,180,000 per second.'
> >>>>
> >>>> Also note, Time2 lacked translation to Local time, which would be needed 
> >>>> for consistency with Time now.
> >>>>
> >>>
> >>> Well, i am not started modifying Time now, (will start in couple minutes 
> >>> ;)
> >>> but here results of DateAndTime now
> >>> before and after:
> >>>
> >>> before:
> >>>
> >>>
> >>> [ DateAndTime now ] bench '316,000 per second.'
> >>>
> >>> after:
> >>>
> >>> [ DateAndTime now ] bench '414,000 per second.'
> >>>
> >>>
> >>> with Time now, i think even if it will be "2,300,000" answers per second,
> >>> it is fairly acceptable , when accuracy of primitive is 1 microsecond,
> >>> you actually don't need more than 1 million answers per second, or you
> >>> will receive same answers.
> >>>
> >>> But aside of it, may i ask, why performance is so important/critical
> >>> for those? What is use case?
> >>>
> >>
> >> everything is good in comparison:
> >>
> >> [ self yourself ] bench '58,800,000 per second.'
> >>
> >> does nothing and just 25 times faster.. than Time now,
> >> so what is the point? :)
> >
> > The point was raising awareness that performance differences are also 
> > worthy of measuring when doing a reimplementation, not just code 
> > cleanliness.
> > A 3x decrease in performance is worth at least consideration as part of a 
> > reimplementation, even when the conclusion is "it's plenty fast enough for 
> > most uses anyways".
> >
> > Not to mention, "Made X Y% faster" looks better in the release notes than 
> > "Restructured the internals of X" :)
> >
> RIght.
> So, it is 3x slower , 1000x more accurate (milli vs micro), do not
> requires startup code
> do not need to account for counter wrapping and day change => much
> cleaner and nicer.
> + less buggy.
> As to me , the choice is obvious.
> 
> and when we implement a proper 64-bit system with e.g. 61-bit SmallIntegers 
> it will no longer be 3 times slower :)

Sorry for the derail, but why not 62? ;)
http://forum.world.st/Fwd-Plan-discussion-communication-around-new-object-format-tp4632394p4632431.html

Cheers,
Henry

Reply via email to