[Vm-dev] Re: [squeak-dev] Re: [Pharo-project] Cog VM -- Thanks
and Performance / Optimization Questions
Eliot Miranda
eliot.miranda at gmail.com
Fri Feb 18 21:50:54 UTC 2011
On Fri, Feb 18, 2011 at 1:41 PM, Igor Stasenko <siguctua at gmail.com> wrote:
>
> It seems that you guys (Stephane & Juan) both making same mistake. :)
>
> You trying to assign multiple different roles to Transcript at once:
> - be a stream
> - be a GUI element (can draw/update itself on a screen)..
>
> Hey.. Transcript is not a swiss knife!
> It is just a stream (kind of special one), but other than that.. it is
> just a stream.
> And what you see on a screen - it is just a view of it.
>
+1
>
> So, Juan it is cool that you have better Transcript... still it having
> same deficiencies which i shown to Stephane not long ago,
> and tried to convince him that Transcript is a stream, not a window. A
> Transcript window is just a view of real transcript.
>
> And i think this is quite easy to make this separation and have sound
> model.
>
>
> On 18 February 2011 19:33, Juan Vuletich <juan at jvuletich.org> wrote:
> > Hi Eliot,
> >
> > Eliot Miranda wrote:
> >>
> >> Hi John,
> >>
> >> good questions.
> >>
> >> On Thu, Feb 17, 2011 at 6:21 AM, John B Thiel <jbthiel at gmail.com
> >> <mailto:jbthiel at gmail.com>> wrote:
> >>
> >> Cog VM -- Thanks and Performance / Optimization Questions
> >>
> >> ...
> >> (Also, any notoriously slow subsystems? For example, Transcript
> >> writing is glacial.)
> >>
> >>
> >> Someone should replace the Transcript's reliance on (I think) some kind
> of
> >> FormMorph which moved huge numbers of bits on each write. But this is
> not a
> >> VM issue. It's a Smalltalk issue. Whoever did this would instantly
> become
> >> a hero.
> >
> > There are other problems with Transcript besides performance. It is easy
> to
> > break the UI if called at the wrong times. In those cases, it is usually
> > needed to kill Squeak from the OS. Besides, it is not thread safe.
> >
> > Instantly becoming a hero sounds cool, so this is my attempt at it :) I
> only
> > tried this in Cuis, but I believe it should work on Squeak and Pharo
> without
> > much trouble. After loading this code, you can evaluate 'Smalltalk at:
> > #Transcript put: NewTranscript'.
> >
> > Some good properties of this are:
> > - Very fast.
> > - Thread safe!
> > - Doesn't use Morphic at all. Can be used to debug Morphic itself.
> > - Doesn't do delayed execution (no events, no forked processes).
> Immediate
> > visual feedback.
> > - Can show itself on Display, log to File, both, or none.
> > - Can be used for headless or remote images (for example, web servers).
> >
> > Some possible downsides are:
> > - Output only. Not a text editor. We have the Workspace and the
> Transcripter
> > for that.
> > - No seamless Morphic integration. I'll do one for Cuis, though.
> >
> > If no serious problems are found, I'll remove TranscriptStream from Cuis,
> > and rename this class as Transcript.
> >
> > Cheers,
> > Juan Vuletich
> >
> > 'From Cuis 3.0 of 31 January 2011 [latest update: #790] on 18 February
> 2011
> > at 2:36:31 pm'!
> > !classDefinition: #NewTranscript category: #'System-Support'!
> > Object subclass: #NewTranscript
> > instanceVariableNames: ''
> > classVariableNames: ''
> > poolDictionaries: ''
> > category: 'System-Support'!
> >
> > !NewTranscript commentStamp: '<historical>' prior: 0!
> > A new implementation of Transcript.
> > - Thread safe.
> > - Very fast.
> > - Independent of Morphic or any other UI framework.
> > - Inmediate feedback.
> > - Can log to file.
> > - Not an editor. Only used for output.
> > - All protocol is on the Class side!
> >
> > !classDefinition: 'NewTranscript class' category: nil!
> > NewTranscript class
> > instanceVariableNames: 'entries firstIndex lastIndex
> accessSemaphore
> > unfinishedEntry logToFile showOnDisplay innerRectangle lastDisplayTime'!
> >
> > !DateAndTime methodsFor: 'squeak protocol' stamp: 'jmv 2/18/2011 12:57'!
> > printWithMsOn: aStream
> > "Print with millisecond resolution, no leading space, no offset."
> >
> > | ps |
> > self printYMDOn: aStream withLeadingSpace: false.
> > aStream nextPut: $T.
> > self printHMSOn: aStream.
> > ps _ (self nanoSecond // 1000000) printString padded: #left to: 3
> > with: $0.
> > aStream nextPut: $..
> > aStream nextPutAll: ps! !
> >
> >
> > !NewTranscript class methodsFor: 'preferred protocol' stamp: 'jmv
> 2/18/2011
> > 14:16'!
> > clear
> > | stream |
> > accessSemaphore critical: [
> > "Having at least one entry simplifies handling of the
> entries
> > circular collection"
> > firstIndex _ 1.
> > lastIndex _ 1.
> > entries at: 1 put: 'Transcript'.
> > unfinishedEntry reset.
> >
> > logToFile ifTrue: [
> > stream _ StandardFileStream forceNewFileNamed:
> self
> > filename.
> > [
> > stream nextPutAll: 'Transcript log
> started:
> > '.
> > DateAndTime now printOn: stream.
> > stream
> > lf;
> > nextPutAll:
> >
> '------------------------------------------------------------------------';
> > lf
> > ] ensure: [ stream close ]]].
> > self display! !
> >
> > !NewTranscript class methodsFor: 'preferred protocol' stamp: 'jmv
> 2/18/2011
> > 14:16'!
> > log: aString
> > self addEntry: aString.
> > self display! !
> >
> > !NewTranscript class methodsFor: 'preferred protocol' stamp: 'jmv
> 2/18/2011
> > 11:49'!
> > logToFile
> > "
> > self logToFile
> > "
> > logToFile _ true! !
> >
> > !NewTranscript class methodsFor: 'old Transcript compatibility' stamp:
> 'jmv
> > 2/18/2011 11:20'!
> > cr
> > "WriteStream protocol.
> > In the older TranscriptStream, it added a CR character.
> > Now, finish the current incomplete entry."
> >
> > self finishEntry! !
> >
> > !NewTranscript class methodsFor: 'old Transcript compatibility' stamp:
> 'jmv
> > 2/18/2011 11:20'!
> > crtab
> > "WriteStream protocol.
> > End the current entry, and start a new one starting with a single
> tab
> > character."
> >
> > self cr; tab! !
> >
> > !NewTranscript class methodsFor: 'old Transcript compatibility' stamp:
> 'jmv
> > 2/18/2011 11:21'!
> > endEntry
> > "For compatibility with old TranscriptStream. nop here"! !
> >
> > !NewTranscript class methodsFor: 'old Transcript compatibility' stamp:
> 'jmv
> > 2/18/2011 11:21'!
> > flush
> > "For compatibility with old TranscriptStream. nop here"! !
> >
> > !NewTranscript class methodsFor: 'old Transcript compatibility' stamp:
> 'jmv
> > 2/18/2011 14:17'!
> > nextPut: aCharacter
> > "WriteStream protocol.
> > Append aCharacter to the unfinishedEntry.
> > cr characters sent with this message do NOT finish the current
> > unfinishedEntry."
> >
> > unfinishedEntry nextPut: aCharacter.
> > self displayUnfinishedEntry! !
> >
> > !NewTranscript class methodsFor: 'old Transcript compatibility' stamp:
> 'jmv
> > 2/18/2011 14:17'!
> > nextPutAll: aString
> > "WriteStream protocol.
> > Append aString to the unfinishedEntry.
> > cr characters sent with this message do NOT finish the current
> > unfinishedEntry."
> >
> > unfinishedEntry nextPutAll: aString.
> > self displayUnfinishedEntry! !
> >
> > !NewTranscript class methodsFor: 'old Transcript compatibility' stamp:
> 'jmv
> > 2/18/2011 11:20'!
> > print: anObject
> > "Stream protocol"
> > anObject printOn: self! !
> >
> > !NewTranscript class methodsFor: 'old Transcript compatibility' stamp:
> 'jmv
> > 2/18/2011 11:22'!
> > show: anObject
> > "Old TranscriptStream protocol."
> > self nextPutAll: anObject asString! !
> >
> > !NewTranscript class methodsFor: 'old Transcript compatibility' stamp:
> 'jmv
> > 2/18/2011 11:22'!
> > space
> > "WriteStream protocol.
> > Append a space character to the receiver."
> >
> > self nextPut: Character space! !
> >
> > !NewTranscript class methodsFor: 'old Transcript compatibility' stamp:
> 'jmv
> > 2/18/2011 11:22'!
> > tab
> > "WriteStream protocol.
> > Append a tab character to the receiver."
> >
> > self nextPut: Character tab! !
> >
> > !NewTranscript class methodsFor: 'private' stamp: 'jmv 2/18/2011 12:59'!
> > addEntry: aString
> > "Add a new entrie to the entries circular list. If full, a new
> entry
> > will replace the oldest one."
> > | msg now |
> > logToFile ifTrue: [
> > now _ DateAndTime now.
> > msg _ String streamContents: [ :strm |
> > now printWithMsOn: strm.
> > strm
> > nextPutAll: ' process:';
> > nextPutAll: Processor activeProcess
> priority
> > printString;
> > nextPut: $ ;
> > nextPutAll: Processor activeProcess hash
> > printString;
> > nextPut: $ ;
> > nextPutAll: aString;
> > lf ]].
> >
> > self addEntry: aString logToFile: msg! !
> >
> > !NewTranscript class methodsFor: 'private' stamp: 'jmv 2/18/2011 12:34'!
> > addEntry: aString logToFile: otherString
> > "Add a new entrie to the entries circular list. If full, a new
> entry
> > will replace the oldest one."
> > | stream |
> > accessSemaphore critical: [
> >
> > "Internal circular collection"
> > lastIndex _ lastIndex \\ self maxEntries + 1.
> > firstIndex = lastIndex ifTrue: [
> > firstIndex _ firstIndex \\ self maxEntries + 1 ].
> > entries at: lastIndex put: aString.
> >
> > "external file"
> > otherString ifNotNil: [
> > [
> > stream _ StandardFileStream fileNamed:
> self
> > filename.
> > stream
> > setToEnd;
> > nextPutAll: otherString;
> > flush]
> > ensure: [ stream close ]
> > ]
> > ]! !
> >
> > !NewTranscript class methodsFor: 'private' stamp: 'jmv 2/18/2011 14:16'!
> > finishEntry
> > | newEntry |
> > newEntry _ unfinishedEntry contents.
> > unfinishedEntry reset.
> > self addEntry: newEntry.
> > self display! !
> >
> > !NewTranscript class methodsFor: 'displaying' stamp: 'jmv 2/18/2011
> 14:20'!
> > display
> > showOnDisplay ifTrue: [
> > self displayOn: Display.
> > lastDisplayTime _ DateAndTime now ]! !
> >
> > !NewTranscript class methodsFor: 'displaying' stamp: 'jmv 2/18/2011
> 14:09'!
> > displayOn: aForm
> > "
> > experimentos
> > NewTranscript displayOn: Display
> > "
> > | font port count i string x y fh f |
> > aForm border: (innerRectangle outsetBy: 3) width: 3.
> > aForm fill: innerRectangle fillColor: Color white.
> > port _ BitBlt toForm: aForm.
> > port clipWidth: innerRectangle right.
> > font _ StrikeFont default.
> > font installOn: port foregroundColor: Color black.
> >
> > fh _ font height.
> > count _ innerRectangle height // fh-1.
> > x _ innerRectangle left.
> > y _ innerRectangle top.
> > f _ firstIndex-1.
> > firstIndex > lastIndex ifTrue: [ f _ f - self maxEntries ].
> > i _ (lastIndex - count max: f) \\ self maxEntries + 1.
> > [
> > string _ entries at: i.
> > port displayString: string from: 1 to: string size at: x at y
> > strikeFont: font kern: font baseKern negated.
> > y _ y + fh.
> > i = lastIndex
> > ] whileFalse: [ i _ i \\ self maxEntries + 1 ].
> >
> > string _ unfinishedEntry contents.
> > port displayString: string from: 1 to: string size at: x at y
> > strikeFont: font kern: font baseKern negated.! !
> >
> > !NewTranscript class methodsFor: 'displaying' stamp: 'jmv 2/18/2011
> 14:23'!
> > displayUnfinishedEntry
> > showOnDisplay ifTrue: [
> > (lastDisplayTime isNil or: [ (DateAndTime now -
> > lastDisplayTime) totalSeconds > 1 ])
> > ifTrue: [ ^self display ].
> > self displayUnfinishedEntryOn: Display ]! !
> >
> > !NewTranscript class methodsFor: 'displaying' stamp: 'jmv 2/18/2011
> 14:14'!
> > displayUnfinishedEntryOn: aForm
> >
> > | font port count string x y fh |
> > port _ BitBlt toForm: aForm.
> > port clipWidth: innerRectangle right.
> > font _ StrikeFont default.
> > font installOn: port foregroundColor: Color black.
> >
> > fh _ font height.
> > count _ innerRectangle height // fh-1.
> > x _ innerRectangle left.
> >
> > string _ unfinishedEntry contents.
> > y _ ((lastIndex - firstIndex \\ self maxEntries) min: count-1) + 1
> *
> > font height + innerRectangle top.
> > port displayString: string from: 1 to: string size at: x at y
> > strikeFont: font kern: font baseKern negated.! !
> >
> > !NewTranscript class methodsFor: 'class initialization' stamp: 'jmv
> > 2/18/2011 13:13'!
> > initialize
> > "
> > self initialize
> > "
> > showOnDisplay _ true.
> > innerRectangle _ 20 at 20 extent: 300 at 500.
> > logToFile _ false.
> > entries _ Array new: self maxEntries.
> > unfinishedEntry _ '' writeStream.
> > accessSemaphore _ Semaphore forMutualExclusion.
> > self clear! !
> >
> > !NewTranscript class methodsFor: 'constants' stamp: 'jmv 2/18/2011
> 12:33'!
> > filename
> > ^'transcript.txt'! !
> >
> > !NewTranscript class methodsFor: 'constants' stamp: 'jmv 2/18/2011
> 12:59'!
> > maxEntries
> > ^1000! !
> >
> > NewTranscript initialize!
> >
> >
> >
> >
>
>
>
> --
> Best regards,
> Igor Stasenko AKA sig.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20110218/bcf3e921/attachment-0001.htm
More information about the Vm-dev
mailing list