Hi.

I profiled a bit and found problem:

PharoClassInstaller>>migrateClasses: old to: new using:
anInstanceModification
instanceModification := anInstanceModification.
old ifEmpty:  [ ^ self ].
[
1 to: old size do: [ :index |
self updateClass: (old at: index) to: (new at: index)].
old elementsForwardIdentityTo: new.
" Garbage collect away the zombie instances left behind in garbage memory
in #updateInstancesFrom: "
" If we don't clean up this garbage, a second update would revive them with
a wrong layout! "
" (newClass rather than oldClass, since they are now both newClass) "
Smalltalk garbageCollect.
] valueUnpreemptively

Commenting garbage collection here increases performance 10 times.
Then commenting class update loop increases performance 3 times more. But
this loop is required. It adopts all instances of old class to new one. And
time here spent in #allInstances method.

Can we remove manual garbage collection here? Why it is needed?

2017-04-12 9:34 GMT+02:00 Peter Uhnak <i.uh...@gmail.com>:

> Hi,
>
> does anyone know why adding instance variables is so slow?
>
> I did some quick benchmarks (see below), resulting in more than order of
> magnitude speed difference between having it in the class definition and
> adding it later.
>
> In fact it is still much faster to delete the class and then recreate it
> with the instance variables in the d efinition. For four arguments it is
> till 8x faster to delete the class four times and recreate it then just add
> the variable. Unfortunately I cannot just trash the classes (they have
> methods and inheritance).
>
> So the question is: why is it so slow? can I somehow improve the
> performance?
>
> Thanks,
> Peter
>
>
> Benchmarks:
>
>
> [
>         cls := Object subclass: #Some1.
>         cls removeFromSystem.
> ] bench. "'91 per second'"
>
> [
>         cls := Object subclass: #Some2 instanceVariableNames: 'variable'.
>         cls removeFromSystem
> ] bench. "'90 per second'"
>
> [
>         cls := Object subclass: #Some3.
>         cls addInstVarNamed: 'variable'.
>         cls removeFromSystem.
> ] bench. "'7 per second'"
>
> [
>         cls := Object subclass: #Some4.
>         cls removeFromSystem.
>         cls := Object subclass: #Some4 instanceVariableNames: 'variable'.
>         cls removeFromSystem.
> ] bench. "'43 per second'"
>
>
>
>
> [
>         cls := Object subclass: #Some3.
>         cls addInstVarNamed: 'variable1'.
>         cls addInstVarNamed: 'variable2'.
>         cls addInstVarNamed: 'variable3'.
>         cls addInstVarNamed: 'variable4'.
>         cls removeFromSystem.
> ] bench. "'2 per second'"
>
> [
>         cls := Object subclass: #Some4.
>         cls removeFromSystem.
>         cls := Object subclass: #Some4 instanceVariableNames: 'variable1
> variable2 variable3 variable4'.
>         cls removeFromSystem.
> ] bench. "'44 per second'"
>
> [
>         cls := Object subclass: #Some5.
>         cls removeFromSystem.
>         cls := Object subclass: #Some5 instanceVariableNames: 'variable1'.
>         cls removeFromSystem.
>         cls := Object subclass: #Some5 instanceVariableNames: 'variable1
> variable2'.
>         cls removeFromSystem.
>         cls := Object subclass: #Some5 instanceVariableNames: 'variable1
> variable2 variable3'.
>         cls removeFromSystem.
>         cls := Object subclass: #Some5 instanceVariableNames: 'variable1
> variable2 variable3 variable4'.
>         cls removeFromSystem.
> ] bench. "'17.269 per second'"
>
>

Reply via email to