Vector som Array PDF Skriv ut Skicka sidan
2010-02-16 23:28

Det är ju så hett just nu att Flash Player kommer till mobila-enheter (frtm. iPhone) så måste man börja tänka på prestandan lite mer än tidigare.

Vector är en intressant klass som jag känt till sen ett tag tillbaka, men jag har aldrig riktigt testat den.

Vector är en Array men skillnad mellan new Array och new Vector är:

Array

  • Array kan innehålla olika typer av data så som 
     var arr:Array = new Array("En string", 19, new Sprite());
    trace(arr); //En string,19,[object Sprite] 
  • Array är långsammare

Vector

  • Vector kan också innehålla flera datatyper, men används helst för samma datatyp. 
    exempelvis bara siffror eller bara strängar eller bara Sprites 
  • Vector är snabbare

 

Följande är tagen härifrån: 

Förutom datatypsbegränsningen innehåller klassen Vector andra begränsningar som skiljer den från klassen Array:

  • En Vector är en kompakt array. Till skillnad från en Array, som kan ha indexvärden för 0 och 7 även om inga värden finns på positionerna 1 till 6, måste en Vector ha ett värde (ellernull) för varje index.
  • En Vector kan ställas in så att den har fast längd, vilket betyder att det antal element den innehåller inte kan ändras.
  • Åtkomsten till element tillhörande en Vector är avgränsningskontrollerad. Du kan aldrig läsa ett värde från ett index som är större än det sista elementet (length - 1 ). Du kan aldrig sätta ett värde med ett index större än ett över det aktuella sista indexet (du kan alltså bara sätta ett värde vid ett existerande index eller vid index-([length] ).

Tack vare sina begränsningar har en Vector två stora fördelar gentemot en Array-instans vars element alla är instanser av en enda klass:

  • Prestanda: åtkomst och upprepning av arrayelement går mycket snabbare när du använder en Vector-instans än när du använder en Array.
  • Typsäkerhet: i strikt läge kan kompileraren identifiera datatypfel som till exempel tilldelning av ett värde av fel datatyp till en Vector, eller förutse fel datatyp när den läser ett värde från en Vector. Observera: när metoderna push() eller unshift() används för att lägga till värden till en Vector kontrolleras inte argumentets datatyp vid kompileringen utan vid körningen.

 

Till lilla testet nu...

Jag skapar en Vector här som innehåller bara strängar

var arr:Vector.< String > = new Vector.< String >();
arr[0] = "Första";
arr[1] = "Andra";
arr[2] = "Tredje";
trace(arr); //Första,Andra,Tredje
var arr:Vector. = new Vector.();
arr[0] = "Första";
arr[1] = "Andra";
arr[2] = "Tredje";
trace(arr); //Första,Andra,Tredje

Däremot, om jag skulle byta ut en av Strängar till ett nummer (int)

var arr:Vector.< String > = new Vector.< String >();
arr[0] = "Första";
arr[1] = "Andra";
arr[2] = 3;
trace(arr); //1067: Implicit coercion of a value of type int to an unrelated type String.

Men om jag envisas med sträng blandningen med siffror då kan jag skriva så:

var arr:Vector.< Object > = new Vector.< Object >();
arr[0] = "Första";
arr[1] = "Andra";
arr[2] = 3;
trace(arr); //Första,Andra,3.

 

Nu, prestandan...

Ett enkelt sätt att köra detta och se skillnader kan vara så

var arr:Vector.< Number > = new Vector.< Number >(); 
var tid:Number = getTimer(); //hur lång tid har det tagit hittills
for (var i:int = 0; i< 300000; i++) { 
    arr = Math.random()*1024;
}
trace(getTimer() - tid);  //39 - hur lång tid har det tagit totalt (minus) tiden innan

men kör jag samma för Array

var arr:Array = new Array();
var tid:Number = getTimer(); 
for (var i:int = 0; i< 300000; i++) { 
    arr = Math.random()*1024; 
} 
trace(getTimer() - tid);  //66

och om jag blandar olika typer av data i Vector, så ser det ut så

var arr:Vector.< Object > = new Vector.< Object >(); 
var tid:Number = getTimer();
arr[0] = "HELLO WORLD!";
arr[1] = new Sprite();
for (var i:int = 0; i< 300000; i++) { 
    arr = Math.random()*1024;
}
trace(getTimer() - tid); //60

och byter jag istället tillbaka till var arr:Array = new Array(); och körde samma kod som den precis ovan, då fick jag ut så mycket som 70.

Intressant, eller hur ?

EDIT:
Patric tipsade om en bra länk gällandes prestanda, kolla här! 


 


Bedöm artikeln:
( 1 Bedömning )
Skapad 2010-02-16 23:28 av Danel Kirch

Visad 1425 gånger än så länge.
Taggad underArrayVectorprestanda

Senaste artiklarna av Danel Kirch


Senast uppdaterad 2010-03-03 23:23

Kommentarer  

 
+1 #1 Patric Jonsson 2010-02-17 07:44
Och när vi talar om prestanda tycker jag denna kan nämnas:
www.bytearray.org/?p=1363
Citera
 
 
0 #2 Danel Kirch 2010-02-17 11:50
Citerar Patric Jonsson:
Och när vi talar om prestanda tycker jag denna kan nämnas:
www.bytearray.org/?p=1363

perfa Patric, jag lägger till den i inlägget så det alltid finns synligt :)
Citera
 
 
0 #3 Richard 2010-04-05 12:17
"Vector kan också innehålla flera datatyper"

Detta är väl en grov förvrängning av sanningen? En Vector kan bara innehålla objekt som uppfyller den datatyp som specificerades när vektorn skapades. För att kunna använda olika datatyper måste man specificera en basklass, och sedan måste samtliga objekt i vektorn vara antingen av den typen, eller en sub-typ.
Citera
 

Lägg till kommentar


Medlemmar


Members Online: 0

Senaste registrerade

LisaRaichand : 22 april 2012 19:55pilu : 31 januari 2012 09:58Gostship99 : 07 januari 2012 19:37Director : 18 november 2011 05:44Dahlback : 17 november 2011 16:28mikwonwheels : 14 november 2011 13:20Kviddis : 04 oktober 2011 19:53buddha1966 : 25 september 2011 14:22idesign : 20 september 2011 08:45TxT : 05 september 2011 11:07ApelG : 05 september 2011 11:04
Partners
Adobe user group
fdt5-logo
TechSmith
Lynda user group
Apress user group
O´reilly user group
Peachpit user group
Friends Of Ed
Manning user group


Senaste blogginläggen

Av: Danel
-20.02.2012
Av: Patric Jonsson
-27.01.2012
Av: Patric Jonsson
- 3.01.2012
Av: Patric Jonsson
-29.11.2011
Av: Danel
-26.11.2011
Av: Patric Jonsson
-14.11.2011
Av: Patric Jonsson
- 8.11.2011
Av: Danel
- 7.11.2011
Av: Patric Jonsson
-27.09.2011

Senaste kommentarer

Senaste trådarna

Av Hallon
- 08/05/2012
Av goldensebbe
- 06/04/2012
Av Hallon
- 29/03/2012
Av buddha1966
- 06/03/2012
Av buddha1966
- 29/02/2012
Av Wide Circle
- 20/02/2012
Av zocstyle
- 15/02/2012
Av ufoalf30
- 05/01/2012
Av peterdavidsson
- 08/12/2011
Av JohnPaulie
- 03/12/2011
Av coffaldo
- 17/11/2011
Av buddha1966
- 05/11/2011
Av buddha1966
- 03/11/2011

Blogkalender

  • 2012 (3)
  • 2011 (37)
  • 2010 (85)
  • 2009 (18)
  • Vem är online

    Vi har 1682 besökare online
    RSS
    Danel Kirch
    RocketTheme Joomla Templates