Newsgroup: it.comp.lang.visual-basic
Titolo: VBNet - Redim Preserve Array Vs ArrayList

ripensando a un post di qualche giorno fa..
ho provato le varie alternative
lavoro con una media di 1000/2000 elementi grafici, memorizzati in una
array, da sparare a video in real time.
Condizione ottimale per misurare le performances di una applicazione.
Record definito su Structure stravince su Class
L'array di user type (o structure, o reference type) stravince su ArrayList,
che a livello di performance si comporta né più né meno di una Collection
Per l'Array, come mi è stato giustamente suggerito, Redim Preserve ogni
volta esegue la copia intera dell'array, e la logica farebbe pensare che una
collection o simili (che forniscono un semplice Add), rappresenta l'ottimale
per operazioni del genere.
Non mi risulta che sia così.
Un Redim Preserve opportunamente calibrato (incremento dell'array su base
100, ad esempio) aggira il problema, e benché risulti comunque
apparentemente inefficente rispetto all'Add di cui sopra, ciò che penalizza
Collection e ArrayList non è tanto l'ottenimento, quanto la lettura, che è
trrrremendamente lenta rispetto all'altra alternativa
Provare per credere:
Public Class ClsTest
   Public P1 as Point
   Public P2 as Point
End Class
Public Structure RkTest
   Public P1 as Point
   Public P2 as Point
End Structure
..
..
Dim i, j as Integer
Dim aList As New ArrayList
Dim bList() As RkTest
Dim r as New Random
For i = 1 to 5000
      Dim c as New clsTest
      c.P1 = New Point(r.Next(0,500),r.Next(0,500))
      c.P2 = New Point(r.Next(0,500),r.Next(0,500))
      aList.Add c
      Redim Preserve bList(i)
      bList(i).P1 = New Point(r.Next(0,500),r.Next(0,500))
      bList(i).P2 = New Point(r.Next(0,500),r.Next(0,500))
Next
For j = 1 to 20
    For i = 1 to 5000
          Graphics.DrawLine(Pens.Black,aList(i).P1,aList(i).P2)
          Graphics.DrawLine(Pens.Black,bList(i).P1,bList(i).P2)
    Next
Next
----
Trattasi di codice scritto al volo, no debugged!
chi vuol provare, adatti il tutto a una soluzione di test, e ovviamente
commenti a senconda del caso l'array o l'ArrayList
Fabio Guerrazzi

 per operazioni del genere.
Non ho guardato il codice IL generato dalla Redim, può darsi che funzioni
diversamente da VB6 dato che in C# ad es. non esiste la redim di un array.
In VB6 la redim si limita ad allocare in coda lo spazio nuovo, ed è per
questo che può agire solo sull'ultima dimensione dell'array.
Letture interessanti:
http://snipurl.com/48i0
e le specifiche dell'IL che potrebbe essere interessante
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335-part-i
-iv.pdf
Le Partition II e III in particolare.
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 Fabio Guerrazzi
-- 
.A
UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org
Read my blog at: 
http://www.ugidotnet.org/4.blog

 convertire l'arraylist in array "convenzionale"...
Come vedrai modificandolo con il ReDim incrementale, in aggiunta le
prestazioni si equivalgono (ArrayList resta un po' piů performante) , in
lettura l'array continua a stravincere.
C'č comunque qualcosa che non torna. L'Array di Classi, cosě come l'abbiamo
impostata entrambi, NON ha assolutamente queste prestazioni se si accede ai
membri di ogni elemento. Se trovo il tempo faccio dei test approfonditi con
tutti i casi, e se sarai disposto ad una valutazione seria ne sarei felice,
poiché questo tipo di ottimizzazione per me sarebbe  davvero determinante
Fabio