Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano szczegółowe informacje o wydajności dla alokacji logicznych w polu.
Przyczyna
Wartości logiczne boksu na platformie .NET tworzą alokacje sterty za każdym razem, gdy bool element jest konwertowany na typ interfejsu object lub . Te alokacje, choć małe, mogą szybko gromadzić się w ścieżkach kodu o krytycznym znaczeniu dla wydajności i powodować niepotrzebne wykorzystanie pamięci, zwłaszcza gdy te same wartości logiczne są wielokrotnie w pudełku.
Opis szczegółowych informacji o wydajności
Gdy wartość logiczna jest w polu, środowisko uruchomieniowe przydziela nowy obiekt na stercie, aby opakować typ wartości. Ponieważ istnieją tylko dwie możliwe wartości logiczne (true i false), wielokrotne boxing tych wartości jest marnujące. Zamiast zezwalać na niejawne boksowanie, bardziej wydajne jest buforowanie boxowanych wystąpień i ponowne użycie ich. Możesz utworzyć statyczne pola readonly dla pól i true wartości oraz false zwrócić odpowiednie wystąpienie buforowane w razie potrzeby.
Jak zbadać ostrzeżenie
Kliknij link Zbadaj , aby przejść do widoku Alokacja pokazującego przydzielone obiekty logiczne. Dwukrotne kliknięcie alokacji spowoduje wyświetlenie ścieżek kodu, w których występują alokacje. Rozważ zmniejszenie tych alokacji przez buforowanie wartości logicznych w polu i zwracanie buforowanych wystąpień zamiast zezwalać na powtarzające się operacje boxingu.
Jeśli opcja Copilot jest włączona, zostanie wyświetlony
Wybierz przycisk, a Copilot udostępnia szczegółową analizę wzorców alokacji i sugeruje poprawki kodu w celu zoptymalizowania użycia pamięci.
Oto przykład alokacji wartości logicznej w polu i jego rozwiązania:
Naruszenie:
class Example
{
public object GetResult(bool condition)
{
return condition; // Implicit boxing occurs here
}
}
Rozwiązanie:
class Example
{
private static readonly object BoxedTrue = true;
private static readonly object BoxedFalse = false;
public object GetResult(bool condition)
{
return condition ? BoxedTrue : BoxedFalse;
}
}
Dodatkowe zasoby
Aby uzyskać więcej informacji na temat unikania alokacji boksu i innych najlepszych rozwiązań dotyczących wydajności, zobacz następujące zasoby:
Boxing and Unboxing (Przewodnik programowania w języku C#)
CA1841: Preferuj metodę Dictionary.Contains (analiza kodu)
Postępując zgodnie z tymi wytycznymi, możesz upewnić się, że aplikacja jest zoptymalizowana pod kątem wydajności i unika niepotrzebnych obciążeń związanych z boksem.