Basisarray Any () vs Länge

7

Ich habe ein einfaches Array von Objekten:

%Vor%

Ich möchte testen, ob diese Methode beliebige Kontakte zurückgibt. Ich mag die LINQ-Syntax für Any() , weil sie hervorhebt, was ich erreichen möchte:

%Vor%

Ist das jedoch langsamer als nur die Länge des Arrays zu testen?

%Vor%

Gibt es irgendeine Möglichkeit, herauszufinden, welche Art von Operation Any() in diesem Fall ausführt, ohne dass Sie hier nachfragen müssen? So etwas wie ein Profiler, aber für In-Memory-Sammlungen?

    
CodingIntrigue 18.03.2014, 08:58
quelle

5 Antworten

6

Es gibt zwei Any() Methoden: 1. Eine Erweiterungsmethode für IEnumerable<T> 2. Eine Erweiterungsmethode für IQueryable<T>

Ich nehme an, dass Sie die Erweiterungsmethode für IEnumerable<T> verwenden. Das sieht so aus:

%Vor%

Grundsätzlich ist die Verwendung von Length == 0 schneller, da kein Iterator für das Array erstellt wird.

Wenn Sie Code auschecken möchten, der nicht Ihr ist (also Code, der bereits kompiliert wurde), wie zum Beispiel Any<T> , können Sie eine Art Disassembler verwenden. Jetbrains hat einen gratis - Ссылка

    
Shani Elharrar 18.03.2014, 09:04
quelle
4

Wenn Sie ein Array haben, befindet sich die Länge in einer Eigenschaft des Arrays. Wenn Sie Any aufrufen, iterieren Sie das Array, um das erste Element zu finden. Das Einrichten des Enumerators ist wahrscheinlich teurer als das Lesen der Length-Eigenschaft.

    
Peter 18.03.2014 09:01
quelle
3

Ja, es ist langsamer, weil es über die Elemente iteriert. Die Verwendung von Length -Eigenschaft ist besser. Aber ich glaube nicht, dass es einen signifikanten Unterschied gibt, weil Any true zurückgibt, sobald ein Gegenstand gefunden wird.

    
Selman Genç 18.03.2014 09:01
quelle
3

In Ihrem Fall ist Length etwas besser :

%Vor%

Aber der Unterschied scheint vernachlässigbar zu sein.

In allgemeinem Fall ist Any jedoch besser, weil beim ersten gefundenen Element stoppt

%Vor%     
Dmitry Bychenko 18.03.2014 09:15
quelle
2

Ich muss den anderen Antworten völlig widersprechen. Es wird nicht über das Array iteriert . Es wird geringfügig langsamer sein, da es ein Array-Iterator-Objekt erstellen und MoveNext() einmal aufrufen muss, aber diese Kosten sollten in den meisten Szenarien vernachlässigbar sein. Wenn Any() den Code für Sie lesbarer macht, können Sie ihn verwenden.

Quelle: Decompiled Enumerable.Any<TSource> code.

    
decPL 18.03.2014 09:05
quelle

Tags und Links