Reguły wydajności
Reguły wydajności obsługują biblioteki i aplikacje o wysokiej wydajności.
W tym obszarze
Reguła | opis |
---|---|
CA1802: Używaj literałów wszędzie tam, gdzie jest to odpowiednie | Pole jest zadeklarowane jako statyczne i tylko do odczytu (udostępnione i tylko do odczytu w języku Visual Basic) i jest inicjowane przy użyciu wartości, która jest kompilowana w czasie kompilacji. Ponieważ wartość przypisana do pola docelowego jest obliczana w czasie kompilacji, zmień deklarację na const (Const in Visual Basic), aby wartość była obliczana w czasie kompilacji zamiast w czasie wykonywania. |
CA1805: Nie inicjuj niepotrzebnie | Środowisko uruchomieniowe platformy .NET inicjuje wszystkie pola typów odwołań do ich wartości domyślnych przed uruchomieniem konstruktora. W większości przypadków jawne inicjowanie pola do jego wartości domyślnej jest nadmiarowe, co zwiększa koszty konserwacji i może obniżyć wydajność (na przykład ze zwiększonym rozmiarem zestawu). |
CA1806: Nie ignoruj wyników metod | Nowy obiekt jest tworzony, ale nigdy nie jest używany, lub metoda, która tworzy i zwraca nowy ciąg, jest wywoływany, a nowy ciąg nigdy nie jest używany, albo model obiektów składowych (COM) lub metoda P/Invoke zwraca hrESULT lub kod błędu, który nigdy nie jest używany. |
CA1810: Inicjuj pola statyczne typu referencyjnego śródwierszowo | Podczas gdy typ deklaruje jawny, statyczny konstruktor, kompilator just in time (JIT) do każdej metody statycznej dodaje sprawdzenie i konstruktora wystąpienia, aby upewnić się, że konstruktor statyczny został wcześniej wywołany. Sprawdzenia konstruktora statycznego mogą obniżyć wydajność. |
CA1812: Unikaj klas wewnętrznych bez wystąpień | Wystąpienie typu na poziomie zestawu nie jest tworzone przez kod w zestawie. |
CA1813: Unikaj niezapieczętowanych atrybutów | Platforma .NET udostępnia metody pobierania atrybutów niestandardowych. Domyślnie te metody wyszukują hierarchie dziedziczenia atrybutu. Plombowanie atrybutu eliminuje wyszukiwanie przez hierarchię dziedziczenia i może zwiększyć wydajność. |
CA1814: Wybieraj tablice nieregularne zamiast wielowymiarowych | Nieregularna tablica to ta, której elementy są tablicami. Tablice tworzące elementy mogą mieć różne rozmiary, co może spowodować mniejsze marnowanie miejsca dla niektórych zestawów danych. |
CA1815: Przesłoń metodę equals i operator równości dla typów wartości | Dla typów wartości dziedziczona implementacja operatora Equas wykorzystuje bibliotekę odbić i porównuje zawartość wszystkich pól. Odbicie jest obliczeniowo kosztowne, a porównanie równości każdego pola może być niepotrzebne. Jeśli można się spodziewać, że użytkownicy będą porównywać lub sortować wystąpienia lub używać wystąpień jako kluczy tabel haszowanych, typ wartości powinien implementować Equals. |
CA1819: Właściwości nie powinny zwracać tablic | Tablice zwracane przez właściwości nie są chronione przed zapisem, nawet jeśli właściwość jest tylko do odczytu. Aby zachować tablicę odporną na manipulacje, właściwość musi zwracać kopię tablicy. Zwykle użytkownicy nie rozumieją, jakie niekorzystne następstwa dla wydajności ma wywołanie takiej właściwości. |
CA1820: Testuj obecność pustych ciągów przy użyciu długości ciągu | Porównywanie ciągów za pomocą właściwości String.Length lub metody String.IsNullOrEmpty jest znacznie szybsze niż użycie operatora Equals. |
CA1821: Usuwaj puste finalizatory | Jeśli to tylko możliwe, należy unikać finalizatorów ze względu na dodatkowe obciążenie, które bierze udział w śledzeniu okresu istnienia obiektu. Pusty finalizator generuje dodatkowe koszty bez żadnych korzyści. |
CA1822: Oznaczaj składowe jako statyczne | Elementy członkowskie, które nie uzyskują dostępu do danych wystąpienia lub wywołają metody wystąpienia, mogą być oznaczone jako statyczne (udostępnione w Visual Basic). Po oznaczeniu metod jako statyczne kompilator wygeneruje niewirtualne wywołania do tych członków. To może dać wymierny zysk wydajnościowy dla kodu wrażliwego na wydajność. |
CA1823: Unikaj nieużywanych pól prywatnych | Zostały wykryte pola prywatne, które w zestawie nie są widoczne jako dostępne. |
CA1824: Oznaczaj zestawy za pomocą atrybutu NeutralResourcesLanguageAttribute | Atrybut NeutralResourcesLanguage informuje menedżera zasobów o języku, który został użyty do wyświetlania zasobów neutralnej kultury dla zestawu. To zwiększa wydajność wyszukiwania dla pierwszego zasobu, który się ładuje i może zmniejszyć zestaw roboczy. |
CA1825: Unikaj alokacji tablic o zerowej długości | Inicjowanie tablicy o zerowej długości prowadzi do niepotrzebnej alokacji pamięci. Zamiast tego użyj statycznie przydzielonego pustego wystąpienia tablicy, wywołując metodę Array.Empty. Alokacja pamięci jest współdzielona we wszystkich wywołaniach tej metody. |
CA1826: Użyj właściwości zamiast metody Linq Enumerable | Enumerable Metoda LINQ została użyta dla typu, który obsługuje równoważną, bardziej wydajną właściwość. |
CA1827: Nie używaj funkcji Count/LongCount, gdy można użyć dowolnego | Count metoda lub LongCount została użyta, gdzie Any metoda byłaby bardziej wydajna. |
CA1828: Nie używaj funkcji CountAsync/LongCountAsync, gdy można użyć narzędzia AnyAsync | CountAsync metoda lub LongCountAsync została użyta, gdzie AnyAsync metoda byłaby bardziej wydajna. |
CA1829: Użyj właściwości Length/Count zamiast metody Enumerable.Count | Count Metoda LINQ została użyta dla typu, który obsługuje równoważne, bardziej wydajne Length lub Count właściwości. |
CA1830: Preferuj silnie typizowane przeciążenia metody Append i Insert w programie StringBuilder | Append i Insert zapewniają przeciążenia dla wielu typów poza System.String. Jeśli to możliwe, preferuj przeciążenia silnie typizowane przy użyciu metody ToString() i przeciążenia opartego na ciągach. |
CA1831: Użyj narzędzia AsSpan zamiast indeksatorów opartych na zakresie dla ciągu, jeśli jest to konieczne | W przypadku używania indeksatora zakresu w ciągu i niejawnego przypisania wartości do typu char ReadOnlySpan<metoda Substring zostanie użyta zamiast Slice, co spowoduje utworzenie kopii żądanej części> ciągu. |
CA1832: Użyj klasy AsSpan lub AsMemory zamiast indeksatorów opartych na zakresie, aby uzyskać fragment ReadOnlySpan lub ReadOnlyMemory tablicy | W przypadku używania indeksatora zakresu w tablicy i niejawnego przypisywania wartości do ReadOnlySpan<T> typu lub ReadOnlyMemory<T> metoda GetSubArray zostanie użyta zamiast Slice, co spowoduje utworzenie kopii żądanej części tablicy. |
CA1833: Użyj klasy AsSpan lub AsMemory zamiast indeksatorów opartych na zakresie do pobierania części span lub pamięci tablicy | W przypadku używania indeksatora zakresu w tablicy i niejawnego przypisywania wartości do Span<T> typu lub Memory<T> metoda GetSubArray zostanie użyta zamiast Slice, co spowoduje utworzenie kopii żądanej części tablicy. |
CA1834: Użyj ciąguBuilder.Append(char) dla ciągów jednoznakowych | StringBuilderAppend ma przeciążenie, które przyjmuje char jako argument. Preferuj wywoływanie przeciążenia, char aby zwiększyć wydajność. |
CA1835: Preferuj przeciążenia oparte na pamięci dla poleceń "ReadAsync" i "WriteAsync" | Element "Stream" ma przeciążenie "ReadAsync", które przyjmuje wartość "Bajt pamięci<>" jako pierwszy argument, a przeciążenie "WriteAsync", które przyjmuje argument "ReadOnlyMemory<Byte>". Preferuj wywoływanie przeciążeń opartych na pamięci, które są bardziej wydajne. |
CA1836: Preferuj IsEmpty Count w przypadku dostępności |
Preferuj IsEmpty właściwość, która jest wydajniejsza niż Count , Length lub Count<TSource>(IEnumerable<TSource>) LongCount<TSource>(IEnumerable<TSource>) określić, czy obiekt zawiera, czy nie żadnych elementów. |
CA1837: Użyj Environment.ProcessId zamiast Process.GetCurrentProcess().Id |
Environment.ProcessId jest prostsza i szybsza niż Process.GetCurrentProcess().Id . |
CA1838: Unikaj StringBuilder parametrów dla parametrów P/Invoke |
Marshalling StringBuilder zawsze tworzy natywną kopię buforu, co powoduje wiele alokacji dla jednej operacji marshallingu. |
CA1839: Użyj elementu Environment.ProcessPath zamiast Process.GetCurrentProcess(). MainModule.FileName | Environment.ProcessPath jest prostsza i szybsza niż Process.GetCurrentProcess().MainModule.FileName . |
CA1840: Użyj wartości Environment.CurrentManagedThreadId zamiast Thread.CurrentThread.ManagedThreadId | Environment.CurrentManagedThreadId jest bardziej kompaktowy i wydajny niż Thread.CurrentThread.ManagedThreadId . |
CA1841: Preferuj słownik zawiera metody | Wywoływanie Contains kolekcji Keys lub Values może być często droższe niż wywoływanie ContainsKey lub ContainsValue w samym słowniku. |
CA1842: Nie używaj elementu "WhenAll" z pojedynczym zadaniem | Użycie WhenAll z jednym zadaniem może spowodować utratę wydajności. Zamiast tego zaczekaj na zadanie lub zwróć je. |
CA1843: Nie używaj funkcji "WaitAll" z jednym zadaniem | Użycie WaitAll z jednym zadaniem może spowodować utratę wydajności. Zamiast tego zaczekaj na zadanie lub zwróć je. |
CA1844: Podaj zastąpienia oparte na pamięci metod asynchronicznych podczas podklasowania "Stream" | Aby zwiększyć wydajność, zastąp metody asynchroniczne oparte na pamięci podczas podklasowania "Stream". Następnie zaimplementuj metody oparte na tablicy pod względem metod opartych na pamięci. |
CA1845: Użyj ciągu opartego na span. Concat' | Bardziej wydajne jest użycie AsSpan operatorów Substring i , string.Concat a nie i operator łączenia. |
CA1846: Preferuj AsSpan ponad Substring |
AsSpan jest wydajniejszy niż Substring . Substring Wykonuje kopię ciągu O(n), a nie AsSpan i nie ma stałego kosztu. AsSpan nie wykonuje również żadnych alokacji sterty. |
CA1847: Użyj literału znaków dla wyszukiwania pojedynczego znaku | Użyj String.Contains(char) zamiast String.Contains(string) podczas wyszukiwania pojedynczego znaku. |
CA1848: Użyj delegatów loggerMessage | Aby uzyskać lepszą wydajność, użyj LoggerMessage delegatów. |
CA1849: Wywoływanie metod asynchronicznych w przypadku metody asynchronicznej | W metodzie, która jest już asynchroniczna, wywołania innych metod powinny dotyczyć ich wersji asynchronicznych, w których istnieją. |
CA1850: Preferuj metodę statyczną HashData za pośrednictwem ComputeHash |
Wydajniejsze jest użycie metody statycznej HashData w celu utworzenia HashAlgorithm wystąpienia i zarządzania nim w celu wywołania metody ComputeHash . |
CA1851: Możliwe wiele wyliczeń kolekcji IEnumerable |
Możliwe wiele wyliczeń kolekcji IEnumerable . Rozważ użycie implementacji, która pozwala uniknąć wielu wyliczeń. |
CA1852: Uszczelnij typy wewnętrzne | Typ, który nie jest dostępny poza zestawem i nie ma podtypów w ramach zestawu zawierającego zestaw, nie jest zapieczętowany. |
CA1853: Niepotrzebne wywołanie elementu "Dictionary.ContainsKey(key)" | Nie ma potrzeby ochrony Dictionary.Remove(key) za pomocą polecenia Dictionary.ContainsKey(key) . Dictionary<TKey,TValue>.Remove(TKey) już sprawdza, czy klucz istnieje i nie zgłasza go, jeśli nie istnieje. |
CA1854: Preferuj metodę "IDictionary.TryGetValue(TKey, out TValue)" | Preferuj element "TryGetValue" za pośrednictwem indeksatora słownika chronionego przez sprawdzanie "ContainsKey". Element "ContainsKey" i indeksator wyszukują klucz, więc użycie polecenia "TryGetValue" pozwala uniknąć dodatkowego wyszukiwania. |
CA1855: Użyj opcji Span<T>. Clear() zamiast Span<T>. Fill() | Bardziej wydajne jest wywołanie Span<T>.Clear() metody niż wywołanie Span<T>.Fill(T) w celu wypełnienia elementów zakresu wartością domyślną. |
CA1856: Nieprawidłowe użycie atrybutu ConstantExpected | Atrybut ConstantExpectedAttribute nie jest poprawnie stosowany w parametrze. |
CA1857: Parametr oczekuje stałej w celu uzyskania optymalnej wydajności | Nieprawidłowy argument jest przekazywany do parametru, który jest oznaczony adnotacją .ConstantExpectedAttribute |
CA1858: Użyj polecenia StartsWith zamiast indexOf | Wywołanie metody jest bardziej wydajne niż wywołanie String.StartsWith String.IndexOf w celu sprawdzenia, czy ciąg zaczyna się od danego prefiksu. |
CA1859: Używaj typów, gdy jest to możliwe w celu zwiększenia wydajności | Kod używa typów interfejsów lub typów abstrakcyjnych, co prowadzi do niepotrzebnych wywołań interfejsu lub wywołań wirtualnych. |
CA1860: Unikaj używania metody rozszerzenia "Enumerable.Any()" | Bardziej wydajne i jaśniejsze jest użycie Length elementów , Count lub IsEmpty (jeśli jest to możliwe) niż wywołanie Enumerable.Any metody w celu określenia, czy typ kolekcji ma jakiekolwiek elementy. |
CA1861: Unikaj tablic stałych jako argumentów | Tablice stałe przekazywane jako argumenty nie są ponownie używane, co oznacza obciążenie związane z wydajnością. Rozważ wyodrębnienie ich do pól "statycznych do odczytu" w celu zwiększenia wydajności. |
CA1862: Użyj przeciążeń metody "StringComparison", aby wykonać porównania ciągów bez uwzględniania wielkości liter | Gdy wywołania ToLower() kodu lub ToUpper() wykonanie porównania ciągu bez uwzględniania wielkości liter, wykonywana jest niepotrzebna alokacja. |
CA1863: Użyj formatu złożonego | Aby zmniejszyć koszt formatowania, buforuj i użyj CompositeFormat wystąpienia jako argumentu do String.Format lub StringBuilder.AppendFormat . |
CA1864: Preferuj metodę "IDictionary.TryAdd(TKey, TValue)" | Zarówno, Dictionary<TKey,TValue>.ContainsKey(TKey) jak i Dictionary<TKey,TValue>.Add wykonaj wyszukiwanie, które jest nadmiarowe. Bardziej wydajne jest wywołanie Dictionary<TKey,TValue>.TryAddmetody , która zwraca wartość wskazującą bool , czy wartość została dodana, czy nie. TryAdd nie zastępuje wartości klucza, jeśli klucz jest już obecny. |
CA1865-CA1867: Użyj przeciążenia char | Przeciążenie znaków jest lepszym przeciążeniem dla ciągu z pojedynczym znakiem. |
CA1868: Niepotrzebne wywołanie funkcji "Contains" dla zestawów | Zarówno ISet<T>.Add(T) , jak i ICollection<T>.Remove(T) wykonaj wyszukiwanie, co sprawia, że jest ono nadmiarowe do wywołania ICollection<T>.Contains(T) wcześniej. Bardziej wydajne jest wywołanie Add(T) lub Remove(T) bezpośrednie zwrócenie wartości logicznej wskazującej, czy element został dodany, czy usunięty. |
CA1869: Buforowanie i ponowne używanie wystąpień "JsonSerializerOptions" | Użycie lokalnego JsonSerializerOptions wystąpienia programu do serializacji lub deserializacji może znacznie obniżyć wydajność aplikacji, jeśli kod jest wykonywany wiele razy, ponieważ plik System.Text.Json wewnętrznie buforuje metadane związane z serializacji do podanego wystąpienia. |
CA1870: Użyj buforowanego wystąpienia "SearchValues" | Użycie buforowanego SearchValues<T> wystąpienia jest bardziej wydajne niż przekazywanie wartości bezpośrednio do "IndexOfAny" lub "ContainsAny". |
CA1871: Nie przekazuj struktury dopuszczalnej wartości null do klasy "ArgumentNullException.ThrowIfNull" | Wyrażenie "ArgumentNullException.ThrowIfNull" akceptuje obiekt "object", więc przekazanie struktury dopuszczających wartość null może spowodować, że wartość zostanie w polu. |
CA1872: Preferuj metodę "Convert.ToHexString" i "Convert.ToHexStringLower" za pośrednictwem łańcuchów wywołań opartych na metodzie "BitConverter.ToString" | Użyj Convert.ToHexString lub Convert.ToHexStringLower podczas kodowania bajtów do reprezentacji ciągu szesnastkowego. Te metody są bardziej wydajne i przyjazne alokacji niż w BitConverter.ToString połączeniu z String.Replace w celu zastąpienia kreski i String.ToLower. |
Współpracuj z nami w serwisie GitHub
Źródło tej zawartości można znaleźć w witrynie GitHub, gdzie można również tworzyć i przeglądać problemy i żądania ściągnięcia. Więcej informacji znajdziesz w naszym przewodniku dla współtwórców.