[squeak-dev] The Inbox: Chronology-Core-mt.50.mcz

David T. Lewis lewis at mail.msen.com
Mon Nov 4 11:16:52 UTC 2019


On Mon, Nov 04, 2019 at 10:05:10AM +0100, Marcel Taeumel wrote:
> Hi Dave,
> 
> yes, that's an important tweak.
> 
> I was wondering about this:
> 
> ...
> elapsedTime := Time millisecondsSince: startTime.
> gcTime := (Smalltalk vmParameterAt: 8) + (Smalltalk vmParameterAt: 10) - gcStart.
> ...
> 
> How complex is #millisecondsSince:? Would it make sense to swap those lines? Given that #bench usually runs for 5 seconds and the GC time is expressed in %, this might be irrelevant...??
> 

The way you wrote it is good.

You might get a couple of large integers instantiated in millisecondsSince:
but only on 32 bits, and the chance of that affecting the GC measurement
is about zero. Besides, the two vmParameterAt: calls may instantiate objects
within the primitive anyway.

Dave


> Best,
> Marcel
> Am 02.11.2019 16:15:53 schrieb David T. Lewis <lewis at mail.msen.com>:
> +1 for inclusion, with the following suggested tweak:
> 
> Use printShowingMaxDecimalPlaces: rather than roundTo: in the percent
> GC display, and also drop the space before the $%. Thus the last line
> of the method would be:
> 
> 
> pair second } ]), (' {1}% GC time.' format: {gcTime / elapsedTime * 100 printShowingMaxDecimalPlaces: 5})
> 
> 
> Rationale: Rounding may not do what you expect with some float calculations.
> This may be VM dependent (I can explain in a separate follow up message),
> but for example I saw occasional results like this:
> 
> '85,200 per second. 11.7 microseconds per run. 2.3850000000000002 % GC time.'
> 
> Using printShowingMaxDecimalPlaces: will ensure this instead:
> 
> '85,200 per second. 11.7 microseconds per run. 2.385% GC time.'
> 
> Dave
> 
> 
> On Wed, Oct 30, 2019 at 11:13:41AM +0100, Tobias Pape wrote:
> > We probably should introduce something like that
> >
> >
> > gcTimings
> >
> > ^ (Smalltalk getVMParameters at: 8 "full") +
> > (Smalltalk getVMParameters at: 10 "incr")
> >
> >
> > Best regards
> > -Tobias
> > > On 30.10.2019, at 10:27, Marcel Taeumel wrote:
> > >
> > > [Error] bench
> > > '217,000,000 per second. 4.62 nanoseconds per run. 0.16 % GC time.'
> > > [Error, Halt] bench
> > > '10,400,000 per second. 96.5 nanoseconds per run. 6.2 % GC time.'
> > > [Error, Halt, Warning] bench
> > > '9,800,000 per second. 102 nanoseconds per run. 7.78 % GC time.'
> > >
> > > Best,
> > > Marcel
> > >> Am 30.10.2019 10:25:21 schrieb commits at source.squeak.org :
> > >>
> > >> A new version of Chronology-Core was added to project The Inbox:
> > >> http://source.squeak.org/inbox/Chronology-Core-mt.50.mcz
> > >>
> > >> ==================== Summary ====================
> > >>
> > >> Name: Chronology-Core-mt.50
> > >> Author: mt
> > >> Time: 30 October 2019, 10:25:14.294226 am
> > >> UUID: f064aadc-0e62-174e-b97c-f70cc22a23f6
> > >> Ancestors: Chronology-Core-mt.49
> > >>
> > >> Proposal to add GC pressure to #bench method.
> > >>
> > >> =============== Diff against Chronology-Core-mt.49 ===============
> > >>
> > >> Item was changed:
> > >> ----- Method: BlockClosure>>benchFor: (in category '*chronology-core') -----
> > >> benchFor: aDuration
> > >> "See how many times I can value within the given duration. I'll answer a meaningful description."
> > >>
> > >> + | startTime shouldRun count elapsedTime roundTo3Digits delay gcStart gcTime |
> > >> - | startTime shouldRun count elapsedTime roundTo3Digits delay |
> > >> roundTo3Digits := [:num |
> > >> | rounded lowDigit |
> > >> rounded := (num * 1000) rounded. "round to 1/1000"
> > >> lowDigit := (rounded numberOfDigitsInBase: 10) - 3. "keep only first 3 digits"
> > >> rounded := rounded roundTo:(10 raisedTo: lowDigit).
> > >> (lowDigit >= 3 or: [rounded \\ 1000 = 0]) "display fractional part only when needed"
> > >> ifTrue: [(rounded // 1000) asStringWithCommas]
> > >> ifFalse: [(rounded / 1000.0) printString]].
> > >> delay := aDuration asDelay.
> > >> count := 0.
> > >> shouldRun := true.
> > >> + Smalltalk garbageCollect.
> > >> [ delay wait. shouldRun := false ] forkAt: Processor timingPriority - 1.
> > >> startTime := Time millisecondClockValue.
> > >> + gcStart := (Smalltalk vmParameterAt: 8) + (Smalltalk vmParameterAt: 10).
> > >> [ shouldRun ] whileTrue: [
> > >> self value.
> > >> count := count + 1 ].
> > >> elapsedTime := Time millisecondsSince: startTime.
> > >> + gcTime := (Smalltalk vmParameterAt: 8) + (Smalltalk vmParameterAt: 10) - gcStart.
> > >> ^(roundTo3Digits value: count * 1000 / elapsedTime) , ' per second.', ((
> > >> #(
> > >> (1e-3 'seconds')
> > >> (1 'milliseconds')
> > >> (1e3 'microseconds')
> > >> (1e6 'nanoseconds')
> > >> )
> > >> detect: [ :pair | elapsedTime * pair first >= count ]
> > >> ifNone: [ #(1e9 'picoseconds') ])
> > >> in: [ :pair |
> > >> ' {1} {2} per run.' format: {
> > >> (roundTo3Digits value: elapsedTime * pair first / count).
> > >> + pair second } ]), (' {1} % GC time.' format: {gcTime / elapsedTime * 100 roundTo: 0.0001})!
> > >> - pair second } ])!
> > >>
> > >>
> > >
> >
> >
> >
> 

> 



More information about the Squeak-dev mailing list