|
| Vector vs. array Fra : Morten Krogh Anderse~ |
Dato : 09-04-03 10:57 |
|
Hejsa
Er det et klogt hovede, som kan svare på, hvor stort et memory-overhead
der er på Vector i forhold til et typespecifikt array?
Mvh. Morten
| |
Robert Larsen (09-04-2003)
| Kommentar Fra : Robert Larsen |
Dato : 09-04-03 11:10 |
|
Morten Krogh Andersen wrote:
> Hejsa
>
> Er det et klogt hovede, som kan svare på, hvor stort et memory-overhead
> der er på Vector i forhold til et typespecifikt array?
>
> Mvh. Morten
>
En hel del.
Med vector skal du foretage stakmanipulation, funktionskald og
allerværst (performance mæssigt) så er det tråd sikkert, hvilket betyder
at monitorer skal tjekkes og låses.
Jeg har dog ingen benchmarks til at bakke min påstand op.
VH
Robert
| |
Robert Larsen (09-04-2003)
| Kommentar Fra : Robert Larsen |
Dato : 09-04-03 11:16 |
|
Robert Larsen wrote:
> Morten Krogh Andersen wrote:
>
>> Hejsa
>>
>> Er det et klogt hovede, som kan svare på, hvor stort et
>> memory-overhead der er på Vector i forhold til et typespecifikt array?
>>
>> Mvh. Morten
>>
> En hel del.
> Med vector skal du foretage stakmanipulation, funktionskald og
> allerværst (performance mæssigt) så er det tråd sikkert, hvilket betyder
> at monitorer skal tjekkes og låses.
> Jeg har dog ingen benchmarks til at bakke min påstand op.
>
> VH
> Robert
>
Damn...det kan godt være at jeg skal til at læse hvad jeg svarer på før
jeg svarer.
MEMORY overheadet er ca. ikke-eksisterende. Vector indeholder to int's
(8 bytes) samt et array, så forskellen må være 8 bytes.
VH
Robert
| |
Morten Krogh Anderse~ (09-04-2003)
| Kommentar Fra : Morten Krogh Anderse~ |
Dato : 09-04-03 12:10 |
|
Robert Larsen wrote:
> Robert Larsen wrote:
>
>> Morten Krogh Andersen wrote:
>>
>>> Hejsa
>>>
>>> Er det et klogt hovede, som kan svare på, hvor stort et
>>> memory-overhead der er på Vector i forhold til et typespecifikt array?
>>>
>>> Mvh. Morten
>>>
>> En hel del.
>> Med vector skal du foretage stakmanipulation, funktionskald og
>> allerværst (performance mæssigt) så er det tråd sikkert, hvilket
>> betyder at monitorer skal tjekkes og låses.
>> Jeg har dog ingen benchmarks til at bakke min påstand op.
>>
>> VH
>> Robert
>>
> Damn...det kan godt være at jeg skal til at læse hvad jeg svarer på før
> jeg svarer.
> MEMORY overheadet er ca. ikke-eksisterende. Vector indeholder to int's
> (8 bytes) samt et array, så forskellen må være 8 bytes.
>
> VH
> Robert
Hej Robert
Tak for at du tog dig tid til at læse spørgsmålet ordentligt ;)
Og tak for svaret!
Jeg indlæser et ukendt antal objekter, som jeg skal bruge referencer til
i flere forskellige klasser. Dvs. at jeg kun tilgår objekterne gennem
Vector'en een gang. Derefter tilgår jeg dem direkte, så derfor er det
kun memory overhead jeg er(var) bekymret for :)
Mvh. Morten
| |
Robert Larsen (09-04-2003)
| Kommentar Fra : Robert Larsen |
Dato : 09-04-03 12:59 |
|
Morten Krogh Andersen wrote:
> Hej Robert
>
> Tak for at du tog dig tid til at læse spørgsmålet ordentligt ;)
> Og tak for svaret!
>
> Jeg indlæser et ukendt antal objekter, som jeg skal bruge referencer til
> i flere forskellige klasser. Dvs. at jeg kun tilgår objekterne gennem
> Vector'en een gang. Derefter tilgår jeg dem direkte, så derfor er det
> kun memory overhead jeg er(var) bekymret for :)
>
> Mvh. Morten
>
Hvis trådsikkerhed ikke er et problem burde du bruge ArrayList klassen.
Den er ret magen til Vector bortset fra, at dens metoder ikke er
synkroniserede, så den er en del hurtigere end Vector.
VH
Robert
| |
Morten Krogh Anderse~ (09-04-2003)
| Kommentar Fra : Morten Krogh Anderse~ |
Dato : 09-04-03 13:04 |
|
Robert Larsen wrote:
> Hvis trådsikkerhed ikke er et problem burde du bruge ArrayList klassen.
> Den er ret magen til Vector bortset fra, at dens metoder ikke er
> synkroniserede, så den er en del hurtigere end Vector.
Enig, men skidtet kører på en embedded controller, hvis Java
implementation ikke indeholder ArrayList :)
Mvh. Morten
| |
Michael Banzon (09-04-2003)
| Kommentar Fra : Michael Banzon |
Dato : 09-04-03 16:45 |
|
"Morten Krogh Andersen" <spam1@krogh.net> skrev i en meddelelse
news:3e93ee7e$0$24724$edfadb0f@dread14.news.tele.dk...
> Er det et klogt hovede, som kan svare på, hvor stort et memory-overhead
> der er på Vector i forhold til et typespecifikt array?
I et array hvor du allokerer plads til de objecter som du bruger
vil du bruge det antal bytes som en enkelt reference bruger
gange antallet af objecter...
I en Vector allokerer vector-objectet et array for dig, der i
værste fald er dobbelt så stort som det nødvændige (når der
ikke er mere plads i arrayet fordobles størrelsen). Dette kunne,
ved mange objekter, give et væsentligt overhead...
Så det må vel være en vurdering. Det kommer an på hvor mange
objekter du vil bruge, hvordan du kan indsætte dem, om de skal
slettes, er der flere tråde der skal tilgå dem osv. osv. ...
Håber at det kunne svare på spørgsmålet...
/ Michael
| |
Allan Weber (09-04-2003)
| Kommentar Fra : Allan Weber |
Dato : 09-04-03 21:20 |
|
Morten Krogh Andersen wrote:
> Hejsa
>
> Er det et klogt hovede, som kan svare på, hvor stort et memory-overhead
> der er på Vector i forhold til et typespecifikt array?
>
> Mvh. Morten
Som en anden i tråden påpeger, så risikere du, at en vector er større end
nødvendig, men det kan klares med funktionen trimToSize() som sætter
kapaciteten af vector'eren til dens størrelse.
aw
| |
Michael Banzon (09-04-2003)
| Kommentar Fra : Michael Banzon |
Dato : 09-04-03 20:30 |
|
"Allan Weber" <weber@oncable.dk> skrev i en meddelelse
news:b71o8h$ot5$1@sunsite.dk...
> Som en anden i tråden påpeger, så risikere du, at en vector er større end
> nødvendig, men det kan klares med funktionen trimToSize() som sætter
> kapaciteten af vector'eren til dens størrelse.
Ja ok, men det ville jo give noget unødvændigt overhead...
Hvis man eksempelvis typisk tilføjer 1000 objekter af gangen ville det
der performer bedst nok være et array som man selv håndterer... Og udvider
med 1000 entries pr. gang...
Jeg mener stadig at en grundig vurdering af gennemsnitlig
udførelse/performance
skulle foretages og danne baggrund for valget af implementeringen...
/ Michael
P.S. Wow en masse _fine_ ord!
| |
Robert Larsen (09-04-2003)
| Kommentar Fra : Robert Larsen |
Dato : 09-04-03 21:10 |
|
Michael Banzon wrote:
> "Allan Weber" <weber@oncable.dk> skrev i en meddelelse
> news:b71o8h$ot5$1@sunsite.dk...
>
>>Som en anden i tråden påpeger, så risikere du, at en vector er større end
>>nødvendig, men det kan klares med funktionen trimToSize() som sætter
>>kapaciteten af vector'eren til dens størrelse.
>
>
> Ja ok, men det ville jo give noget unødvændigt overhead...
> Hvis man eksempelvis typisk tilføjer 1000 objekter af gangen ville det
> der performer bedst nok være et array som man selv håndterer... Og udvider
> med 1000 entries pr. gang...
>
> Jeg mener stadig at en grundig vurdering af gennemsnitlig
> udførelse/performance
> skulle foretages og danne baggrund for valget af implementeringen...
>
> / Michael
>
> P.S. Wow en masse _fine_ ord!
>
>
Man kan også selv bestemme hvor meget Vectoren skal udviddes når den
bliver fyldt. Fra JavaDoc'en:
protected int capacityIncrement
The amount by which the capacity of the vector is automatically
incremented when its size becomes greater than its capacity. If the
capacity increment is less than or equal to zero, the capacity of the
vector is doubled each time it needs to grow.
public Vector(int initialCapacity,
int capacityIncrement)
Constructs an empty vector with the specified initial capacity and
capacity increment.
Parameters:
initialCapacity - the initial capacity of the vector.capacityIncrement -
the amount by which the capacity is increased when the vector overflows.
| |
Morten Krogh Anderse~ (10-04-2003)
| Kommentar Fra : Morten Krogh Anderse~ |
Dato : 10-04-03 07:41 |
|
Robert Larsen wrote:
> Michael Banzon wrote:
>> "Allan Weber" <weber@oncable.dk> skrev i en meddelelse
>> news:b71o8h$ot5$1@sunsite.dk...
Blahblah ;)
Takker for de mange fine svar, men som Robert opdagede, så var det KUN
et spørgsmål om memory overhead ved en Vector indeholdende n elementer,
vs. et array indeholdende de samme n elementer.
Jeg opretter et ukendt antal objekter, som jeg efterfølgende henter
referencer til fra forskellige andre objekter. Alle kald foregår
derefter på disse referencer, så der er listetype irrelevant.
Det er et spørgsmål om at smide alle de oprettede objekter over i et
array, efter indlæsningen (og så sætte Vectoren = null), eller at fyre
en Vector.trimToSize() af.. Så jeg gør det sidste. :)
Mvh. Morten
| |
Jakob Justsen (10-04-2003)
| Kommentar Fra : Jakob Justsen |
Dato : 10-04-03 22:18 |
|
Så vidt jeg husker fra min dAds-tider (alogritmer og datastrukturer) på
datalogisk institut, kan man
vist nok bevise at rent performance-mæssigt er det mest effektivt at
fordoble array'et når man løber
tør for plads.
Så man skal vurderer hvorvidt man vil spare hukommelse eller forøge
hastigheden.
/just
"Allan Weber" <weber@oncable.dk> wrote in message
news:b71o8h$ot5$1@sunsite.dk...
> Morten Krogh Andersen wrote:
>
> > Hejsa
> >
> > Er det et klogt hovede, som kan svare på, hvor stort et memory-overhead
> > der er på Vector i forhold til et typespecifikt array?
> >
> > Mvh. Morten
>
> Som en anden i tråden påpeger, så risikere du, at en vector er større end
> nødvendig, men det kan klares med funktionen trimToSize() som sætter
> kapaciteten af vector'eren til dens størrelse.
>
> aw
| |
|
|