Hi�Philippe,
I gave it a short test with the latest Seaside.On 31.12.2010 03:02, Eliot Miranda wrote:
>
>
>
>
> Hi All,
>
> � � �I've released a new version of Cog that has a substantially
> improved code generator along the lines of Peter Deutsch's HPS
> (VisualWorks) and various of Ian Piumarta's VMs. �These all use a simple
> tecnique to identify constant references in bytecode and to support a
> register-based calling convention. �While this does produce faster code
> it tends to accelerate low-level code much more than high-level code as
> you can see by the following benchmarks:
>
> SimpleStackBasedCogit: [1 to: 100000000 do: [:i|]] timeToRun 691
> StackToRegisterMappingCogit: [1 to: 100000000 do: [:i|]] timeToRun 192
> 192 - 691 / 6.91 -72%
>
> SimpleStackBasedCogit: 0 tinyBenchmarks '753495217 bytecodes/sec;
> 64769127 sends/sec'
> StackToRegisterMappingCogit: 0 tinyBenchmarks '931756141 bytecodes/sec;
> 128157989 sends/sec'
> 931756141 - 753495217 / 7534952.17 -24%
> 128157989 - 64769127 / 647691.27 -98%
>
> SimpleStackBasedCogit: [Compiler recompileAll] timeToRun 47013 (no
> transcript
> StackToRegisterMappingCogit: [Compiler recompileAll] timeToRun 43406 (no
> transcript)
> 43406 - 47013 / 470.13 -7.67234594686576
>
> The status of this code is essentially beta. �The test suite runs the
> same on the new code generator as on the old, but I think there are
> still bugs because I get the occasional transient error. �I am therefore
> very interested in any reproducible errors you can find.
>
> The VMs (http://www.mirandabanda.org/files/Cog/VM/VM.r2334/) contain a
> few other important changes:
>
> - a bug fix to bytecode<->native pc mappng that produced incorrect
> results for methods containing blocks with ^-returns in them. �One
> symptom is incorrect highlighting of the pc in the debugger, althoguh
> symptoms could be much serious.
>
> - jitting interpreted methods on backward branches. �Currently any
> interpreted method that performs more than 20 backward branches will be
> considered for JIT compilation and if it is suitable (default, <= 60
> literals) will be compiled to native code.
>
> - new callback support. �I need to commit some changes to the Alien
> package to provide access to this but essentially the VM's callback
> support is now able to be ported to architectures with register-based
> calling conventions (ARM, PowerPC, SPARC etc). �I'll try and get the
> Alien code released soon, and to back-port the changes to the standard
> VM before the end of the holiday.
>
> One thing that is still /not/ fixed is the lack of a SoundPlugin on
> win32. �Apologies. �I'll try and get a fix for this before the end of
> the holidays too, but time might be too tight. �There are other
> priorities such as harmonising the standard and Cog VMs for the 4.2 release.
First the good news, I seem to get an average performance improvement of
about 10%.
However in some very rare cases the temps seem to be mixed up the very
first time a method is executed and fine afterwards. For example in the
method below when the div 'bench' is created. The very first time it is
executed #div is sent to a BlockClosure, the next time it is fine. This
is reproducible, if I recompile the package or restart the image it
happens again the first time and is fine afterwards.
I don't know how I can provide more information but I could upload the
image somewhere.
renderInline: aBlock factor: factor key: key on: html
� � � �| startTime endTime count backColor anAssociation title referenceValue
spi context document renderer stream runTime |
� � � �count := 0.
� � � �runTime := 200.
� � � �anAssociation := referenceDict
� � � � � � � �at: key
� � � � � � � �ifAbsent: [ 'Undefined' -> 100000 ].
� � � �title := anAssociation key.
� � � �referenceValue := anAssociation value.
� � � �stream := WriteStream on: String new.
� � � �document := builder documentClass
� � � � � � � �on: stream
� � � � � � � �codec: builder codec.
� � � �context := WARenderContext new.
� � � �context document: document.
� � � �context
� � � � � � � �actionUrl: builder actionUrl;
� � � � � � � �resourceUrl: builder resourceUrl.
� � � �renderer := builder rendererClass context: context.
� � � �builder
� � � � � � � �openDocument: document
� � � � � � � �context: context.
� � � �html div
� � � � � � � �class: 'bench';
� � � � � � � �with:
� � � � � � � � � � � �[ html heading: title.
� � � � � � � � � � � �startTime := Time millisecondClockValue.
� � � � � � � � � � � �endTime := startTime + runTime.
� � � � � � � � � � � �[ Time millisecondClockValue < endTime ] whileTrue:
� � � � � � � � � � � � � � � �[ count := count + 1.
� � � � � � � � � � � � � � � �renderer
� � � � � � � � � � � � � � � � � � � �render: aBlock;
� � � � � � � � � � � � � � � � � � � �flush ] ].
� � � �builder closeDocument: document.
� � � �spi := (count / referenceValue * (10000 / runTime)) rounded.
� � � �backColor := spi > 100
� � � � � � � �ifTrue: [ '#5f5' ]
� � � � � � � �ifFalse:
� � � � � � � � � � � �[ spi < 50
� � � � � � � � � � � � � � � �ifTrue: [ '#f55' ]
� � � � � � � � � � � � � � � �ifFalse: [ '#55f' ] ].
� � � �duration := duration + spi.
� � � �html div
� � � � � � � �style: 'float:left;padding:4px';
� � � � � � � �with:
� � � � � � � � � � � �[ html big: spi greaseString , ' SPI'.
� � � � � � � � � � � �html span
� � � � � � � � � � � � � � � �class: 'iteration';
� � � � � � � � � � � � � � � �with: '(' , count greaseString , ' iterations)'.
� � � � � � � � � � � �html break.
� � � � � � � � � � � �html div
� � � � � � � � � � � � � � � �class: 'rect';
� � � � � � � � � � � � � � � �style: 'background:' , backColor , ';width:' , (spi * 2)
greaseString , 'px' ].
� � � �html div style: 'clear:both'
Cheers
Philippe