The Inbox: Chronology-Core-mt.51.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

The Inbox: Chronology-Core-mt.51.mcz

commits-2
A new version of Chronology-Core was added to project The Inbox:
http://source.squeak.org/inbox/Chronology-Core-mt.51.mcz

==================== Summary ====================

Name: Chronology-Core-mt.51
Author: mt
Time: 11 November 2019, 11:40:16.217633 am
UUID: 199ad2ea-67cb-2545-84e9-4f24e577216f
Ancestors: Chronology-Core-mt.50

Improve formatting for GC pressure as suggested by Dave.

=============== Diff against Chronology-Core-mt.50 ===============

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 |
  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 printShowingMaxDecimalPlaces: 5})!
- pair second } ]), (' {1} % GC time.' format: {gcTime / elapsedTime * 100 roundTo: 0.0001})!


Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Chronology-Core-mt.51.mcz

Chris Muller-3
Hi guys, 

This looks like a lot of thought went into making an output that we want to be both functional as well as easy to read.

On a similar topic, has anyone else been finding #asBytesDescription to be similarly useful for reporting integral quantities, when the top three orders of precision are enough?  What I like about it is how it lets me express any integer all the way up to (2 raisedTo: 99) in no more than *four* characters.  See?

   9999 asBytesDescription     "10k"
   (2 raisedTo: 99) asBytesDescription     "  '634Y'  <--- Yotta's"    

This is a wonderfully dense representation, but I think extends even beyond "bytes descriptions" -- I think we need a better name for it...  Is there a proper academic name for this representation?

 - Chris


On Mon, Nov 11, 2019 at 4:40 AM <[hidden email]> wrote:
A new version of Chronology-Core was added to project The Inbox:
http://source.squeak.org/inbox/Chronology-Core-mt.51.mcz

==================== Summary ====================

Name: Chronology-Core-mt.51
Author: mt
Time: 11 November 2019, 11:40:16.217633 am
UUID: 199ad2ea-67cb-2545-84e9-4f24e577216f
Ancestors: Chronology-Core-mt.50

Improve formatting for GC pressure as suggested by Dave.

=============== Diff against Chronology-Core-mt.50 ===============

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 |
        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 printShowingMaxDecimalPlaces: 5})!
-                               pair second } ]), (' {1} % GC time.' format: {gcTime / elapsedTime * 100 roundTo: 0.0001})!




Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Chronology-Core-mt.51.mcz

marcel.taeumel
Heyho.

> ... but I think extends even beyond "bytes descriptions" ...

+1 The "bytes" domain is way too specific for this kind of functionality


Best,
Marcel

Am 12.11.2019 04:42:05 schrieb Chris Muller <[hidden email]>:

Hi guys, 

This looks like a lot of thought went into making an output that we want to be both functional as well as easy to read.

On a similar topic, has anyone else been finding #asBytesDescription to be similarly useful for reporting integral quantities, when the top three orders of precision are enough?  What I like about it is how it lets me express any integer all the way up to (2 raisedTo: 99) in no more than *four* characters.  See?

   9999 asBytesDescription     "10k"
   (2 raisedTo: 99) asBytesDescription     "  '634Y'  <--- Yotta's"    

This is a wonderfully dense representation, but I think extends even beyond "bytes descriptions" -- I think we need a better name for it...  Is there a proper academic name for this representation?

 - Chris


On Mon, Nov 11, 2019 at 4:40 AM <[hidden email]> wrote:
A new version of Chronology-Core was added to project The Inbox:
http://source.squeak.org/inbox/Chronology-Core-mt.51.mcz

==================== Summary ====================

Name: Chronology-Core-mt.51
Author: mt
Time: 11 November 2019, 11:40:16.217633 am
UUID: 199ad2ea-67cb-2545-84e9-4f24e577216f
Ancestors: Chronology-Core-mt.50

Improve formatting for GC pressure as suggested by Dave.

=============== Diff against Chronology-Core-mt.50 ===============

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 |
        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 printShowingMaxDecimalPlaces: 5})!
-                               pair second } ]), (' {1} % GC time.' format: {gcTime / elapsedTime * 100 roundTo: 0.0001})!




Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Chronology-Core-mt.51.mcz

Chris Muller-4
(Palm meets forehead.  :)  )

Still, not obvious what would be a good name.  #asMetricDescription?   #printSiUnits?

And, actually, a more general function would seem to beg for more configurability -- like full-name vs. abbreviation, as well the possibility of specifying a precision.

I'll have to think about it, thanks...



On Tue, Nov 12, 2019 at 3:04 AM Marcel Taeumel <[hidden email]> wrote:
Heyho.

> ... but I think extends even beyond "bytes descriptions" ...

+1 The "bytes" domain is way too specific for this kind of functionality


Best,
Marcel

Am 12.11.2019 04:42:05 schrieb Chris Muller <[hidden email]>:

Hi guys, 

This looks like a lot of thought went into making an output that we want to be both functional as well as easy to read.

On a similar topic, has anyone else been finding #asBytesDescription to be similarly useful for reporting integral quantities, when the top three orders of precision are enough?  What I like about it is how it lets me express any integer all the way up to (2 raisedTo: 99) in no more than *four* characters.  See?

   9999 asBytesDescription     "10k"
   (2 raisedTo: 99) asBytesDescription     "  '634Y'  <--- Yotta's"    

This is a wonderfully dense representation, but I think extends even beyond "bytes descriptions" -- I think we need a better name for it...  Is there a proper academic name for this representation?

 - Chris


On Mon, Nov 11, 2019 at 4:40 AM <[hidden email]> wrote:
A new version of Chronology-Core was added to project The Inbox:
http://source.squeak.org/inbox/Chronology-Core-mt.51.mcz

==================== Summary ====================

Name: Chronology-Core-mt.51
Author: mt
Time: 11 November 2019, 11:40:16.217633 am
UUID: 199ad2ea-67cb-2545-84e9-4f24e577216f
Ancestors: Chronology-Core-mt.50

Improve formatting for GC pressure as suggested by Dave.

=============== Diff against Chronology-Core-mt.50 ===============

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 |
        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 printShowingMaxDecimalPlaces: 5})!
-                               pair second } ]), (' {1} % GC time.' format: {gcTime / elapsedTime * 100 roundTo: 0.0001})!




cbc
Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Chronology-Core-mt.51.mcz

cbc
I've personally used #asAbbreviated...String (Bytes and Hz - two cases I have).  I guess more generally #asAbbreviatedString might work.  Or in this case #asAbbreviatedFractionalSeconds?


You just need to know exactly how you round/divide to get what you want.  (Bytes I divide by 1024; HZ by 1000)

-cbc

On Tue, Nov 12, 2019 at 3:26 PM Chris Muller <[hidden email]> wrote:
(Palm meets forehead.  :)  )

Still, not obvious what would be a good name.  #asMetricDescription?   #printSiUnits?

And, actually, a more general function would seem to beg for more configurability -- like full-name vs. abbreviation, as well the possibility of specifying a precision.

I'll have to think about it, thanks...



On Tue, Nov 12, 2019 at 3:04 AM Marcel Taeumel <[hidden email]> wrote:
Heyho.

> ... but I think extends even beyond "bytes descriptions" ...

+1 The "bytes" domain is way too specific for this kind of functionality


Best,
Marcel

Am 12.11.2019 04:42:05 schrieb Chris Muller <[hidden email]>:

Hi guys, 

This looks like a lot of thought went into making an output that we want to be both functional as well as easy to read.

On a similar topic, has anyone else been finding #asBytesDescription to be similarly useful for reporting integral quantities, when the top three orders of precision are enough?  What I like about it is how it lets me express any integer all the way up to (2 raisedTo: 99) in no more than *four* characters.  See?

   9999 asBytesDescription     "10k"
   (2 raisedTo: 99) asBytesDescription     "  '634Y'  <--- Yotta's"    

This is a wonderfully dense representation, but I think extends even beyond "bytes descriptions" -- I think we need a better name for it...  Is there a proper academic name for this representation?

 - Chris


On Mon, Nov 11, 2019 at 4:40 AM <[hidden email]> wrote:
A new version of Chronology-Core was added to project The Inbox:
http://source.squeak.org/inbox/Chronology-Core-mt.51.mcz

==================== Summary ====================

Name: Chronology-Core-mt.51
Author: mt
Time: 11 November 2019, 11:40:16.217633 am
UUID: 199ad2ea-67cb-2545-84e9-4f24e577216f
Ancestors: Chronology-Core-mt.50

Improve formatting for GC pressure as suggested by Dave.

=============== Diff against Chronology-Core-mt.50 ===============

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 |
        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 printShowingMaxDecimalPlaces: 5})!
-                               pair second } ]), (' {1} % GC time.' format: {gcTime / elapsedTime * 100 roundTo: 0.0001})!





Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Chronology-Core-mt.51.mcz

David T. Lewis
In reply to this post by Chris Muller-4
Meanwhile, +1 for moving Marcel's Chronology changes to trunk :-)

Dave

On Tue, Nov 12, 2019 at 05:25:46PM -0600, Chris Muller wrote:

> (Palm meets forehead.  :)  )
>
> Still, not obvious what would be a good name.  #asMetricDescription?
>  #printSiUnits?
>
> And, actually, a more general function would seem to beg for more
> configurability -- like full-name vs. abbreviation, as well the possibility
> of specifying a precision.
>
> I'll have to think about it, thanks...
>
>
>
> On Tue, Nov 12, 2019 at 3:04 AM Marcel Taeumel <[hidden email]>
> wrote:
>
> > Heyho.
> >
> > > ... but I think extends even beyond "bytes descriptions" ...
> >
> > +1 The "bytes" domain is way too specific for this kind of functionality
> >
> > https://en.wikipedia.org/wiki/Metric_prefix
> >
> > Best,
> > Marcel
> >
> > Am 12.11.2019 04:42:05 schrieb Chris Muller <[hidden email]>:
> > Hi guys,
> >
> > This looks like a lot of thought went into making an output that we want
> > to be both functional as well as easy to read.
> >
> > On a similar topic, has anyone else been finding #asBytesDescription to be
> > similarly useful for reporting integral quantities, when the top three
> > orders of precision are enough?  What I like about it is how it lets me
> > express any integer all the way up to (2 raisedTo: 99) in no more than
> > *four* characters.  See?
> >
> >    9999 asBytesDescription     "10k"
> >    (2 raisedTo: 99) asBytesDescription     "  '634Y'  <--- Yotta's"
> >
> > This is a wonderfully dense representation, but I think extends even
> > beyond "bytes descriptions" -- I think we need a better name for it...  Is
> > there a proper academic name for this representation?
> >
> >  - Chris
> >
> >
> > On Mon, Nov 11, 2019 at 4:40 AM <[hidden email]> wrote:
> >
> >> A new version of Chronology-Core was added to project The Inbox:
> >> http://source.squeak.org/inbox/Chronology-Core-mt.51.mcz
> >>
> >> ==================== Summary ====================
> >>
> >> Name: Chronology-Core-mt.51
> >> Author: mt
> >> Time: 11 November 2019, 11:40:16.217633 am
> >> UUID: 199ad2ea-67cb-2545-84e9-4f24e577216f
> >> Ancestors: Chronology-Core-mt.50
> >>
> >> Improve formatting for GC pressure as suggested by Dave.
> >>
> >> =============== Diff against Chronology-Core-mt.50 ===============
> >>
> >> 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 |
> >>         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 printShowingMaxDecimalPlaces: 5})!
> >> -                               pair second } ]), (' {1} % GC time.'
> >> format: {gcTime / elapsedTime * 100 roundTo: 0.0001})!
> >>
> >>
> >>

>


cbc
Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Chronology-Core-mt.51.mcz

cbc
agree. 

On Tue, Nov 12, 2019, 20:51 David T. Lewis <[hidden email]> wrote:
Meanwhile, +1 for moving Marcel's Chronology changes to trunk :-)

Dave

On Tue, Nov 12, 2019 at 05:25:46PM -0600, Chris Muller wrote:
> (Palm meets forehead.  :)  )
>
> Still, not obvious what would be a good name.  #asMetricDescription?
>  #printSiUnits?
>
> And, actually, a more general function would seem to beg for more
> configurability -- like full-name vs. abbreviation, as well the possibility
> of specifying a precision.
>
> I'll have to think about it, thanks...
>
>
>
> On Tue, Nov 12, 2019 at 3:04 AM Marcel Taeumel <[hidden email]>
> wrote:
>
> > Heyho.
> >
> > > ... but I think extends even beyond "bytes descriptions" ...
> >
> > +1 The "bytes" domain is way too specific for this kind of functionality
> >
> > https://en.wikipedia.org/wiki/Metric_prefix
> >
> > Best,
> > Marcel
> >
> > Am 12.11.2019 04:42:05 schrieb Chris Muller <[hidden email]>:
> > Hi guys,
> >
> > This looks like a lot of thought went into making an output that we want
> > to be both functional as well as easy to read.
> >
> > On a similar topic, has anyone else been finding #asBytesDescription to be
> > similarly useful for reporting integral quantities, when the top three
> > orders of precision are enough?  What I like about it is how it lets me
> > express any integer all the way up to (2 raisedTo: 99) in no more than
> > *four* characters.  See?
> >
> >    9999 asBytesDescription     "10k"
> >    (2 raisedTo: 99) asBytesDescription     "  '634Y'  <--- Yotta's"
> >
> > This is a wonderfully dense representation, but I think extends even
> > beyond "bytes descriptions" -- I think we need a better name for it...  Is
> > there a proper academic name for this representation?
> >
> >  - Chris
> >
> >
> > On Mon, Nov 11, 2019 at 4:40 AM <[hidden email]> wrote:
> >
> >> A new version of Chronology-Core was added to project The Inbox:
> >> http://source.squeak.org/inbox/Chronology-Core-mt.51.mcz
> >>
> >> ==================== Summary ====================
> >>
> >> Name: Chronology-Core-mt.51
> >> Author: mt
> >> Time: 11 November 2019, 11:40:16.217633 am
> >> UUID: 199ad2ea-67cb-2545-84e9-4f24e577216f
> >> Ancestors: Chronology-Core-mt.50
> >>
> >> Improve formatting for GC pressure as suggested by Dave.
> >>
> >> =============== Diff against Chronology-Core-mt.50 ===============
> >>
> >> 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 |
> >>         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 printShowingMaxDecimalPlaces: 5})!
> >> -                               pair second } ]), (' {1} % GC time.'
> >> format: {gcTime / elapsedTime * 100 roundTo: 0.0001})!
> >>
> >>
> >>

>