Pop quiz [memory usage]
Fawzi Mohamed
fmohamed at mac.com
Sun Jun 7 01:21:55 PDT 2009
On 2009-06-07 04:07:45 +0200, Sean Kelly <sean at invisibleduck.org> said:
> Fawzi Mohamed wrote:
>> On 2009-06-06 21:07:40 +0200, Sean Kelly <sean at invisibleduck.org> said:
>>
>>> Vladimir Panteleev wrote:
>>>> On Sat, 06 Jun 2009 20:19:45 +0300, Sean Kelly <sean at invisibleduck.org>
>>>> wrote:
>> [...]
>>>>
>>>>> I've been debating for a while whether newCapacity shoulds exist at
>>>>> all. The GC already tends to leave free space at the end of blocks,
>>>>> so why should the runtime second-guess it?
>>>>
>>>> Do you mean at the end of pages, or pools?
>>>
>>> Blocks. Blocks less than 4k in the current allocator are sized in
>>> powers of two, so array appends already get the "double in size"
>>> behavior in Java even without newCapacity. newCapacity just has the
>>> potential to throw an array into the next larger block early, thus
>>> potentially wasting more space if the array will never be appended to.
>>> I think newCapacity isn't supposed to reserve extra space for blocks
>>> larger than 4k, but it's been a while since I've looked at it.
>>
>> at the moment the behavior is exactly the opposite (leaving the small
>> array to the GC handling you just sketched)), only array larger than a
>> page have the special treatment, I think that the idea is that
>> appending to large arrays can be potentially very expensive, so those
>> get the special treatment.
>
> Hm. I still think we'd be better off letting the user handle this. If
> they're going to be appending and performance is important then they'll
> use an ArrayAppender anyway. I'd rather not have extra space tacked
> onto the end of every array I create "just in case" I decide to append
> to it.
well it isn't so bad, newCapacity is used only when the use *is* adding
in place, and the array is not large enough.
Fawzi
More information about the Digitalmars-d
mailing list