[squeak-dev] Re: How weak finalization affects the performance

Levente Uzonyi leves at elte.hu
Tue Oct 26 12:06:11 UTC 2010


On Tue, 26 Oct 2010, Igor Stasenko wrote:

> 2010/10/26 Levente Uzonyi <leves at elte.hu>:
>> On Tue, 26 Oct 2010, Igor Stasenko wrote:
>>
>>> On 26 October 2010 11:49, Andreas Raab <andreas.raab at gmx.de> wrote:
>>>>
>>>> Hi Igor -
>>>>
>>>> I'm having a hard time understanding how adding a delay would improve
>>>> performance. In my code, adding delays generally does the opposite :-)
>>>> Can
>>>> you explain *why* you see a performance improvement? The work done for
>>>> each
>>>> finalized object doesn't differ, does it? So how come you see an
>>>> improvement?
>>>>
>>>
>>> Finalization is triggered at each GC cycle. Putting 5 sec delay makes
>>> a finalization process to
>>> do weak containers scavenging not often than each 5 seconds,
>>> instead after each GC.
>>>
>>> The amount of work to do finalization is same, but you forgetting the cost
>>> of scanning weak dicts to find the objects to be finalized.
>>
>> This is exactly what your new WeakRegistry implementation avoids, isn't it?
>>
>
> Yes.
>
>>>
>>> The code above actually illustrating this overhead:
>>>
>>> | dict b |
>>> dict := WeakKeyDictionary new addAll: (( 1 to: 1000 ) collect: [:i |
>>> i->i] ); yourself.
>>> WeakArray addWeakDependent: dict.
>>>
>>> Here, at each GC cycle, a 'dict finalizeValues' will be sent,
>>> which leads to looping over 1000 entries.
>>> Add dict with 10000 entries, and you will loop over 10000 after each GC.
>>
>> You should never register WeakKeyDictionaries to the finalization process.
>> They are not thread safe.
>>
> Yeah.. still there are some code, which used it.

In Squeak?

>
> And still WeakArray provides a mechanism to add weak dependents,
> so, potentially you could add anything there.  :)

Yes, but it's your responsibility to add appropriate objects.

>
>> Since the next VMs will support your new finalization scheme, I see no
>> benefit from the delay.
>>
>
> Yes. But because Chris have no official VMs with new finalization, he
> using this trick to reduce CPU hog in finalization process.

According to the current schedule, the new VMs will be released in 
december.


Levente

>
>>
>> Levente
>>
>>>
>>>
>>>
>>>> Cheers,
>>>>  - Andreas
>>>>
>>>> On 10/26/2010 12:25 AM, Igor Stasenko wrote:
>>>>>
>>>>> Here the idea, which came to Chris,
>>>>> put a delay into #finalizationProcess loop:
>>>>>
>>>>> finalizationProcess
>>>>>        [true] whileTrue:
>>>>>                [ WeakFinalizationList initTestPair.
>>>>>                FinalizationSemaphore wait.
>>>>>                FinalizationLock critical:
>>>>>                        [
>>>>>                        WeakFinalizationList checkTestPair.
>>>>>                        FinalizationDependents do:
>>>>>                                [:weakDependent |
>>>>>                                weakDependent ifNotNil:
>>>>>                                        [weakDependent finalizeValues]]]
>>>>>                        ifError:
>>>>>                        [:msg :rcvr | rcvr error: msg].
>>>>>                5 seconds asDelay wait.
>>>>>                ].
>>>>>
>>>>>
>>>>> And here a simple benchmark, which triggers GC often:
>>>>>
>>>>> [ Array new: 100 ] bench
>>>>>
>>>>> without delay:
>>>>>
>>>>> '2,450,000 per second.'
>>>>> '2,490,000 per second.'
>>>>> '2,490,000 per second.'
>>>>> '2,480,000 per second.'
>>>>> '2,530,000 per second.'
>>>>>
>>>>> with delay:
>>>>>
>>>>> '2,670,000 per second.'
>>>>> '2,680,000 per second.'
>>>>> '2,690,000 per second.'
>>>>> '2,730,000 per second.'
>>>>>
>>>>> roughly about ~8% faster :)
>>>>>
>>>>> But now lets put something big into weak array:
>>>>>
>>>>> | dict b |
>>>>> dict := WeakKeyDictionary new addAll: (( 1 to: 1000 ) collect: [:i |
>>>>> i->i] ); yourself.
>>>>> WeakArray addWeakDependent: dict.
>>>>> b := [ Array new: 100 ] bench.
>>>>> WeakArray removeWeakDependent: dict.
>>>>> b
>>>>>
>>>>> without delay:
>>>>>
>>>>> '1,840,000 per second.'
>>>>> '2,060,000 per second.'
>>>>> '2,130,000 per second.'
>>>>>
>>>>> with delay:
>>>>>
>>>>> '3,030,000 per second.'
>>>>> '2,880,000 per second.'
>>>>> '2,890,000 per second.'
>>>>>
>>>>> Do not forget to do:
>>>>> WeakArray restartFinalizationProcess
>>>>>
>>>>> when you changing the #finalizationProcess method,
>>>>> otherwise you won't see real numbers.
>>>>>
>>>>> So, i like the idea of putting delay there.
>>>>> Finalization is eventual, and there is no hard guarantees that it will
>>>>> happen in micro-second just after some object become garbage.
>>>>> So, be it 5 seconds or 1000 seconds not really matters.
>>>>> What is matters that with delay we win much more, by avoiding wasting
>>>>> time in finalization process too often.
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Best regards,
>>> Igor Stasenko AKA sig.
>>>
>>
>>
>>
>>
>
>
>
> -- 
> Best regards,
> Igor Stasenko AKA sig.
>
>


More information about the Squeak-dev mailing list