Re: Can arrays be parameters to generics
Christian wrote:
Until now the only reason to optimize collections away for arrays was
never the speed but allways the RAM usage for me.
Whether that is an "optimization" or not depends on a whole lot of things,
like what you sacrifice when you use an array.
If you know that you will be holding about 100k to 1 Mio collections ..
then the overhead of the collections is enormous an using arrays becomes
a must.
No, it doesn't.
ie
HashSet 1 obj holding an hashmap 12byte
HashMap 1 obj holding 8 Byte
3*int+1 float 16
entry array+map entrys 8+n*4 + n*Entry bytes
Entry: 8 Bytes
+ 3 object references 12 Byte
+ 1 int 4 Byte
so hashset:
44+ n*28 byte
(due to the load factor of the hasmap it would be even some bytes more..)
in comparison to just an array: 8+ n*4 bytes
Until now this 7 times overhead in space has allways been the killer
when used en masse.
"Killer"? Funny.
Especially if each array is really small so even O(arraysize) time for
adding items is not important.
This contradicts your point. If the array is "really small", then the memory
overhead for a List or Set is not important. If the array is "really large",
then the O(n) time overhead is important. Except that arrays don't have O(n)
time to insert objects, so I am really lost trying to follow your logic.
Your example contrasts arrays with Sets. That is an apples-to-oranges
comparison. Sets have different logical characteristics than arrays; they are
not interchangeable algorithmically. Comparing memory overhead (even if the
collection is not "really small") is pointless if arrays do not provide the
same behaviors that you need from Sets. Sure, the array is smaller, but at
least it won't work correctly. It will require so much fragile, bug-risking
logic to enforce Set-like behavior on it (especially if concurrency is an
issue) that you are hurting far, far more than you're helping by using it.
The only meaningful comparison is List vs. array, in which the additional
memory overhead for the List is much smaller than in your example, and in
which you must take into account the additional capabilities of the List. For
example, a List handles changing size for you, it has auxiliary help for
synchronized use, it participates well with other collections classes, it
sports a variety of implementations with varying performance and operational
characteristics, you can derive your own custom implementation if necessary, ...
--
Lew