Chris Muller uploaded a new version of Chronology-Core to project The Inbox:
http://source.squeak.org/inbox/Chronology-Core-cmm.47.mcz ==================== Summary ==================== Name: Chronology-Core-cmm.47 Author: cmm Time: 19 May 2019, 11:17:45.809897 pm UUID: 916637af-e396-4b0b-ae64-86c5b5ef2dd9 Ancestors: Chronology-Core-nice.44 - Make #utcOffset: match the prior behavior. - Add #microseconds to the API, too. 300 microSeconds 1 second asMicroSeconds - Move Duration convenience constructors, String-to-date converting methods, and benching API to this package. =============== Diff against Chronology-Core-nice.44 =============== Item was added: + ----- Method: BlockClosure>>bench (in category '*chronology-core') ----- + bench + "See how many times I can value in 5 seconds. I'll answer a meaningful description." + + ^self benchFor: 5 seconds! Item was added: + ----- 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 | + 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. + [ delay wait. shouldRun := false ] forkAt: Processor timingPriority - 1. + startTime := Time millisecondClockValue. + [ shouldRun ] whileTrue: [ + self value. + count := count + 1 ]. + elapsedTime := Time millisecondsSince: startTime. + ^(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 } ])! Item was added: + ----- Method: BlockClosure>>durationToRun (in category '*chronology-core') ----- + durationToRun + "Answer the duration taken before this block returns." + + ^ Time durationToRun: self + ! Item was added: + ----- Method: BlockClosure>>timeToRun (in category '*chronology-core') ----- + timeToRun + "Answer the number of milliseconds taken to execute this block." + + ^ Time millisecondsToRun: self + ! Item was added: + ----- Method: BlockClosure>>timeToRunWithoutGC (in category '*chronology-core') ----- + timeToRunWithoutGC + "Answer the number of milliseconds taken to execute this block without GC time." + + ^(Smalltalk vmParameterAt: 8) + + (Smalltalk vmParameterAt: 10) + + self timeToRun - + (Smalltalk vmParameterAt: 8) - + (Smalltalk vmParameterAt: 10) + ! Item was added: + ----- Method: BlockClosure>>valueWithin:onTimeout: (in category '*chronology-core') ----- + valueWithin: aDuration onTimeout: timeoutBlock + "Evaluate the receiver. + If the evaluation does not complete in less than aDuration evaluate the timeoutBlock instead" + + | theProcess delay watchdog tag | + + aDuration <= Duration zero ifTrue: [^ timeoutBlock value ]. + + "the block will be executed in the current process" + theProcess := Processor activeProcess. + delay := aDuration asDelay. + tag := self. + + "make a watchdog process" + watchdog := [ + delay wait. "wait for timeout or completion" + theProcess ifNotNil:[ theProcess signalException: (TimedOut new tag: tag)] + ] newProcess. + + "Watchdog needs to run at high priority to do its job (but not at timing priority)" + watchdog priority: Processor timingPriority-1. + + "catch the timeout signal" + ^ [ watchdog resume. "start up the watchdog" + self ensure:[ "evaluate the receiver" + theProcess := nil. "it has completed, so ..." + delay delaySemaphore signal. "arrange for the watchdog to exit" + ]] on: TimedOut do: [ :e | + e tag == tag + ifTrue:[ timeoutBlock value ] + ifFalse:[ e pass]].! Item was changed: ----- Method: DateAndTime>>utcOffset: (in category 'squeak protocol') ----- + utcOffset: anOffset + "Answer a DateAndTime equivalent to the receiver but offset from UTC by anOffset" + ^ self class + utcMicroseconds: utcMicroseconds + offset: anOffset asDuration asSeconds! - utcOffset: anOffset - - "Answer a <DateAndTime> equivalent to the receiver but offset from UTC by anOffset" - - self flag: #FIXME. "check the definition of this and of #offset:" - ^self utcMicroseconds: utcMicroseconds offset: anOffset asDuration asSeconds - ! Item was added: + ----- Method: Duration class>>microSeconds: (in category 'squeak protocol') ----- + microSeconds: anInteger + ^ self + seconds: (anInteger quo: 1e6) + nanoSeconds: (anInteger rem: 1e6) * 1000! Item was added: + ----- Method: Duration>>asMicroSeconds (in category 'squeak protocol') ----- + asMicroSeconds + nanos = 0 ifTrue: [ ^ seconds * 1e6 ]. + ^ (seconds * 1e6) + (nanos // 1000)! Item was added: + ----- Method: Integer>>asYear (in category '*chronology-core') ----- + asYear + + ^ Year year: self + ! Item was added: + ----- Method: Number>>asDuration (in category '*chronology-core') ----- + asDuration + + ^ Duration nanoSeconds: self asInteger + ! Item was added: + ----- Method: Number>>day (in category '*chronology-core') ----- + day + + ^ self sign days! Item was added: + ----- Method: Number>>days (in category '*chronology-core') ----- + days + + ^ Duration days: self! Item was added: + ----- Method: Number>>hour (in category '*chronology-core') ----- + hour + + ^ self sign hours + ! Item was added: + ----- Method: Number>>hours (in category '*chronology-core') ----- + hours + + ^ Duration hours: self! Item was added: + ----- Method: Number>>microSecond (in category '*chronology-core') ----- + microSecond + ^ self sign microSeconds! Item was added: + ----- Method: Number>>microSeconds (in category '*chronology-core') ----- + microSeconds + ^ Duration microSeconds: self! Item was added: + ----- Method: Number>>milliSecond (in category '*chronology-core') ----- + milliSecond + + ^ self sign milliSeconds + ! Item was added: + ----- Method: Number>>milliSeconds (in category '*chronology-core') ----- + milliSeconds + + ^ Duration milliSeconds: self + ! Item was added: + ----- Method: Number>>minute (in category '*chronology-core') ----- + minute + + ^ self sign minutes + ! Item was added: + ----- Method: Number>>minutes (in category '*chronology-core') ----- + minutes + + ^ Duration minutes: self! Item was added: + ----- Method: Number>>nanoSecond (in category '*chronology-core') ----- + nanoSecond + + ^ self sign nanoSeconds + ! Item was added: + ----- Method: Number>>nanoSeconds (in category '*chronology-core') ----- + nanoSeconds + + ^ Duration nanoSeconds: self.! Item was added: + ----- Method: Number>>second (in category '*chronology-core') ----- + second + + ^ self sign seconds + ! Item was added: + ----- Method: Number>>seconds (in category '*chronology-core') ----- + seconds + + ^ Duration seconds: self! Item was added: + ----- Method: Number>>week (in category '*chronology-core') ----- + week + + ^ self sign weeks + ! Item was added: + ----- Method: Number>>weeks (in category '*chronology-core') ----- + weeks + + ^ Duration weeks: self! Item was added: + ----- Method: String>>asDate (in category '*chronology-core') ----- + asDate + "Many allowed forms, see Date>>#readFrom:" + + ^ Date fromString: self! Item was added: + ----- Method: String>>asDateAndTime (in category '*chronology-core') ----- + asDateAndTime + + "Convert from UTC format" ^ DateAndTime fromString: self! Item was added: + ----- Method: String>>asDuration (in category '*chronology-core') ----- + asDuration + "convert from [nnnd]hh:mm:ss[.nanos] format. [] implies optional elements" + + ^ Duration fromString: self + ! |
Free forum by Nabble | Edit this page |