[squeak-dev] The Inbox: ShoutCore-ct.71.mcz

Levente Uzonyi leves at caesar.elte.hu
Wed Sep 4 16:55:59 UTC 2019


Hi Christoph,

On Tue, 3 Sep 2019, commits at source.squeak.org wrote:

> A new version of ShoutCore was added to project The Inbox:
> http://source.squeak.org/inbox/ShoutCore-ct.71.mcz
>
> ==================== Summary ====================
>
> Name: ShoutCore-ct.71
> Author: ct
> Time: 3 September 2019, 2:20:09.991948 pm
> UUID: 2635dce1-6bda-3a4d-a726-3f66bb7c6431
> Ancestors: ShoutCore-ul.68
>
> Use TimeStamps instead of deprecated #primUTCMicrosecondClock.

In my understanding, TimeStamp is something we have been keeping around, 
because it's used for printing method timestamps, but for any other 
purpose there's its superclass: DateAndTime.
With some effort, I think we could and should deprecate TimeStamp.

#primUTCMicrosecondClock is still very useful, even though DateAndTime 
instances are not initialized with it anymore.
For example, this primitive has the smallest overhead[1] to measure 
runtime with microsecond resolution, which is exactly what the method 
SHParserST80 class >> #benchmark uses it for.

I mentioned it in an earlier mail that I intend to undeprecate it, and add 
the missing primitive 243 as well, which can be used to tell the VM to 
flush its time zone offset cache.

Levente

[1] It's a numbered primitive with no arguments returning an Integer. On 
64-bits, that integer will stay a SmallInteger for quite a while, so 
there's no overhead on the image side to invoke it.

>
> =============== Diff against ShoutCore-ul.68 ===============
>
> Item was changed:
>  ----- Method: SHParserST80 class>>benchmark (in category 'benchmarking') -----
>  benchmark
>
>  	| methods methodCount totalTime averageTime min median percentile80 percentile95 percentile99 max |
>  	Smalltalk garbageCollect.
>  	methods := OrderedCollection new: 100000.
>  	CurrentReadOnlySourceFiles cacheDuring: [
>  		| parser |
>  		parser := SHParserST80 new.
>  		SystemNavigation default allSelectorsAndMethodsDo: [ :class :selector :method |
>  			| source start ranges |
>  			source := method getSource asString.
> + 			start := TimeStamp now.
> - 			start := Time primUTCMicrosecondClock.
>  			ranges := parser
>  				rangesIn: source
>  				classOrMetaClass: class
>  				workspace: nil
>  				environment: nil.
> + 			methods addLast: { (TimeStamp now - start) asMicroSeconds. method. ranges size } ] ].
> - 			methods addLast: { Time primUTCMicrosecondClock - start. method. ranges size } ] ].
>  	methods sort: #first asSortFunction.
>  	methodCount := methods size.
>  	totalTime := methods detectSum: #first.
>  	averageTime := (totalTime / methodCount) rounded.
>
>  	min := methods first.
>  	median := methods at: methodCount // 2.
>  	percentile80 := methods at: (methodCount * 0.8) floor.
>  	percentile95 := methods at: (methodCount * 0.95) floor.
>  	percentile99 := methods at: (methodCount * 0.99) floor.
>  	max := methods last.
>  	^'
>  	Methods		{1}
>  	Total			{2}ms
>  	Average		{3}ms
>  	Min				{4}ms {5} range(s) ({6})
>  	Median			{7}ms {8} ranges ({9})
>  	80th percentile	{10}ms {11} ranges ({12})
>  	95th percentile	{13}ms {14} ranges ({15})
>  	99th percentile	{16}ms {17} ranges ({18})
>  	Max			{19}ms {20} ranges ({21})' format: ({
>  		methodCount asString.
>  		totalTime.
>  		averageTime.
>  		min first.
>  		min third asString.
>  		min second reference.
>  		median first.
>  		median third asString.
>  		median second reference.
>  		percentile80 first.
>  		percentile80 third asString.
>  		percentile80 second reference.
>  		percentile95 first.
>  		percentile95 third asString.
>  		percentile95 second reference.
>  		percentile99 first.
>  		percentile99 third asString.
>  		percentile99 second reference.
>  		max first.
>  		max third asString.
>  		max second reference } replace: [ :each |
>  			each isNumber
>  				ifTrue: [ (each / 1000) printShowingDecimalPlaces: 3 ]
>  				ifFalse: [ each ] ])!


More information about the Squeak-dev mailing list