Performance - UBound(arr) oder in Arraygröße in Variable speichern?

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Performance - UBound(arr) oder in Arraygröße in Variable speichern?

    Hallo,

    das frage ich mich schon länger: Wenn man die größe eines Arrays sehr oft abrufen muss, z.B. wenn man dieses in vielen Schleifen durchgeht, ist es von der Performance besser, UBound(arr) in einer Variable zu speichern und von dort aus abzurufen, wie hier

    VB.NET-Quellcode

    1. Dim arr As Integer() = {...}
    2. Dim UB as Integer = Ubound(arr)
    3. for i as integer = 0 to UB
    4. arr(i) = ...
    5. next


    oder ist es besser, immer wieder UBound(arr) zu verwenden, wie hier

    VB.NET-Quellcode

    1. Dim arr as integer() = {...}
    2. for i as integer = 0 to Ubound(arr)
    3. arr(i) = ...
    4. next


    Danke,

    Thilo
    Ersteres ist schneller ab geschätzten 2 Zugriffen auf UBound.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ich glaube nicht, dass das in irgend einer Form einen sprürbaren Unteschied bringen wird, da sich das höchstens im Nanosekundenbereich bewegt.
    Allerdings würde ich dir raten, nicht die veraltete Funktion UBound zu verwenden, sondern die objektoriantierte Variante arr.GetUpperBound oder, wenn es ein eindimensionales Array ist, gleich arr.Length.
    Danke, ja, werde in Zukunft arr.Length verwenden. Ich denke auch, dass zwischen

    VB.NET-Quellcode

    1. Dim L as integer = arr.length
    2. for i as integer = 0 to L
    3. arr(i) = ...
    4. next


    und

    VB.NET-Quellcode

    1. for i as integer = 0 to arr.length
    2. arr(i) = ...
    3. next


    kein Unterschied mehr besteht, oder dass sogar die obere Methode langsamer ist. Oder ist jemand anderer Meinung? Danke :)
    @sonne75
    Count() ist eine Extension auf IEnumerable, Length ist einfach nur eine Eigenschaft des Arrays.

    @Thilo87
    Durch die Compileroptimierungen sollte zwischen den beiden Codes im IL nachher kein Unterschied mehr bestehen. Das untere ist aber schöner.
    Immer Length, denn die Extension führt die Operation ja auf einem IEnumerable aus, nicht auf einem Array (Array implementiert IEnumerable nur). Deswegen wird sie sich den Enumerator holen und alles durchenumerieren und mitzählen, was natürlich bei weitem langsamer ist.
    Also Length gibt es nur speziell bei Arrays, nicht bei allen IEnumerables. Deswegen ist es spezifisch für diesen Typen implementiert, sodass hier immer ein konstanter Wert zurückgegeben werden kann (denn Arrays haben eine konstante Größe). Dies ist natürlich sehr schnell.
    Count hingegen weiß nicht, dass es sich bei dem angegebenen IEnumerable um ein Array handelt, da es ja allgemein für alle IEnumerables funktionieren soll, auch für die mit variabler Größe (wie z.B. List(Of T)). Deswegen arbeitet es nur mit den Funktionen von IEnumerable, also es holt sich den Enumerator und zählt dann alle Elemente mit einer Schleife durch. Das ist bei weitem langsamer.

    Thilo87 schrieb:

    VB.NET-Quellcode

    1. for i as integer = 0 to L
    Wenn, dann bitte so:

    VB.NET-Quellcode

    1. for i as integer = 0 to L - 1
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!