Announcement

Collapse
No announcement yet.

Effizientes Suchen in List(of T) Objekten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    des war eigentlich nur mal schnell so runtergetipselt ... also nicht über STIL schimpen :-)


    [highlight=vbnet]
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

    Dim timer1 As New Stopwatch
    Dim i As Integer

    Dim Anzahl As Long = 11000000
    Dim testArr(Anzahl + 1) As Double
    Dim testAL As New List(Of Double)
    Dim testALL As New ArrayList


    timer1.Start()

    For i = 1 To Anzahl
    testArr(i) = i
    Next


    timer1.Stop()
    ListBox1.Items.Add("testArray ADD : " & Anzahl & ": =" & timer1.ElapsedMilliseconds.ToString & " ms")
    Console.WriteLine("testArray ADD : " & Anzahl & ": =" & timer1.ElapsedMilliseconds.ToString & " ms")

    timer1.Reset()


    timer1.Start()

    For i = 1 To Anzahl
    testAL.Add(i)

    Next

    timer1.Stop()
    ListBox1.Items.Add("testArrayListOF( ADD : " & Anzahl & ": =" & timer1.ElapsedMilliseconds.ToString & " ms")
    Console.WriteLine("testArrayListOF( ADD : " & Anzahl & ": =" & timer1.ElapsedMilliseconds.ToString & " ms")
    timer1.Reset()



    timer1.Start()

    For i = 1 To Anzahl
    testALL.Add(i)
    Next

    timer1.Stop()
    ListBox1.Items.Add("testArrayList ADD : " & Anzahl & ": =" & timer1.ElapsedMilliseconds.ToString & " ms")
    Console.WriteLine("testArrayList ADD : " & Anzahl & ": =" & timer1.ElapsedMilliseconds.ToString & " ms")
    timer1.Reset()

    '=============

    Dim dbl As Double

    timer1.Start()

    For i = 1 To Anzahl
    dbl = testArr(i)
    Next


    timer1.Stop()
    ListBox1.Items.Add("testArray Get : " & Anzahl & ": =" & timer1.ElapsedMilliseconds.ToString & " ms")
    Console.WriteLine("testArray Get : " & Anzahl & ": =" & timer1.ElapsedMilliseconds.ToString & " ms")
    timer1.Reset()


    timer1.Start()

    For i = 1 To Anzahl - 1
    dbl = testAL(i)
    Next


    timer1.Stop()
    ListBox1.Items.Add("testAList Get : " & Anzahl & ": =" & timer1.ElapsedMilliseconds.ToString & " ms")
    Console.WriteLine("testAList Get : " & Anzahl & ": =" & timer1.ElapsedMilliseconds.ToString & " ms")
    timer1.Reset()


    timer1.Start()

    For i = 1 To Anzahl - 1
    dbl = testALL(i)
    Next


    timer1.Stop()
    ListBox1.Items.Add("testArrayList Get : " & Anzahl & ": =" & timer1.ElapsedMilliseconds.ToString & " ms")
    Console.WriteLine("testArrayList Get : " & Anzahl & ": =" & timer1.ElapsedMilliseconds.ToString & " ms")
    timer1.Reset()

    End Sub
    [/highlight]

    zu gunsten der "beidenLIST" spricht jedoch ... dass wenn
    der Sieger "Array" mit REDIM erweitert werden wüüüürde
    ... ich warte grad noch aufs ergebniss *ggg* oh man wart wart.....
    ... nach ca. 211710 !! durchläufen abgebroche ... > mehr als ne minute
    also array is nur gut wenns bereits mit maxwerten belegt ist
    bzw. ich setze ... dann immer ein redim mit (maxwerte*2) :-)
    dann gehts meist auch schnell
    Zuletzt editiert von Fremder; 19.03.2010, 13:58.
    Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
    Um heute vorm PC zu sitzen!

    Comment


    • #17
      zu gunsten der "beidenLIST" spricht jedoch ... dass wenn
      der Sieger "Array" mit REDIM erweitert werden wüüüürde ...
      hätte man im Prinzip eine List(of). Denn mehr ist List(of) nicht, ein intelligenter Wrapper um ein Array das in seinen Add, Remove Methoden automatisch ein umallozieren (ich suche einen allgemeinen Begriff für REDIM der auch in anderen Net Sprachen gilt) des internen Arrays vornimmt.

      Der gemessen Unterschied zwischen List(of) und Array sollte nur auf dieses umallozieren zurückzuführen sein. Wenn man List(of) mit Anzahl über den Konstruktor initialisiert so das das interne Array schon die notwendige Größe hat sollte eigentlich fast kein Unterschied mehr messbare sein. außer eben der einen aus der Indirektion über die Methoden von List(of).

      Das gleiche hätte ich auch von Arraylist erwartet. Als zusätzlicher Overhead kommt ja eigentlich nur noch das Boxing von Double nach Object (und umgekehrt) hinzu. Das das soviel ausmacht

      Comment


      • #18
        sehr gut GETROFFEN ... denn:

        wenn man:
        Code:
        Dim testALL As New ArrayList
        Dim myObjekt as Object = 3 
        
        
         timer1.Start()
        
                For i = 1 To Anzahl
                    testALL.Add(myObjekt)
                Next
        timer1.Stop()
        dauerts ~ 400 ms statt ~2200 ms
        dummerweise hat dann myObjekt stets den wert 3 :-)

        Code:
        Dim testALL As New ArrayList
        Dim myObjekt as Object
        
        
         timer1.Start()
                For i = 1 To Anzahl
                     myObjekt = i
                    testALL.Add(myObjekt)
                Next
        timer1.Stop()
        dauert widerrum ~2200 ms *lol*
        > Dim myArray(n) as Object dauert dann ca. 300 ms
        Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
        Um heute vorm PC zu sitzen!

        Comment


        • #19
          Ich weiß zwar nicht wozu DU diese Funktion benötigts bzw. wie die Umgebung aussieht ... ( daher kann dieser Lösungsansatz falsch sein )

          Bau doch eine Schleifenfunktion "nach geänderten Datensätzen filtern" ein ...
          So durchsuchst DU nicht die ganze Tabelle sondern nur immer die geänderten.

          Dadurch reduzierst Du den Traffic und machst die Suche schneller ...

          Comment

          Working...
          X