성능 규칙
성능 규칙은 고성능 라이브러리 및 애플리케이션을 지원합니다.
이 섹션의 내용
규칙 | 설명 |
---|---|
CA1802: 가능하면 리터럴을 사용하십시오. | 필드가 static 및 read-only(Visual Basic의 경우 Shared 및 ReadOnly)로 선언되었으며 컴파일 시간에 계산할 수 있는 값으로 초기화되어 있습니다. 컴파일 시간에 대상 필드에 할당되는 값을 계산할 수 있으므로 값이 런타임이 아닌 컴파일 시간에 계산되도록 선언을 const(Visual Basic의 경우 Const) 필드로 변경합니다. |
CA1805: 불필요하게 초기화하지 마세요 | .NET 런타임은 생성자를 실행하기 전에 참조 형식의 모든 필드를 기본값으로 초기화합니다. 대부분의 경우 필드를 기본값으로 명시적으로 초기화하는 작업이 중복되므로 유지 관리 비용이 증가하며 성능이 저하될 수 있습니다(예: 어셈블리 크기 증가 포함). |
CA1806: 메서드 결과를 무시하지 마십시오. | 새 개체가 만들어지지만 사용되지 않거나, 새 문자열을 만들고 반환하는 메서드가 호출되고 새 문자열이 사용되지 않거나, COM(구성 요소 개체 모델) 또는 P/Invoke 메서드가 사용되지 않는 오류 코드나 HRESULT를 반환합니다. |
CA1810: 참조 형식 정적 필드를 인라인으로 초기화하십시오. | 형식이 명시적인 정적 생성자를 선언하면 JIT(Just-in-Time) 컴파일러는 형식의 각 정적 메서드와 인스턴스 생성자에 검사를 추가하여 정적 생성자를 이전에 호출했는지 확인합니다. 정적 생성자 검사로 인해 성능이 저하될 수 있습니다. |
CA1812: 인스턴스화되지 않은 내부 클래스를 사용하지 마십시오. | 어셈블리 수준 형식의 인스턴스가 어셈블리에서 코드에 의해 만들어지지 않습니다. |
CA1813: 봉인되지 않은 특성을 사용하지 마십시오. | .NET은 사용자 지정 특성을 검색하는 메서드를 제공합니다. 기본적으로 이러한 메서드는 특성 상속 계층을 검색합니다. 특성을 봉인하면 상속 계층을 검색하지 않으므로 성능이 향상될 수 있습니다. |
CA1814: 다차원 배열보다 가변 배열을 사용하십시오. | 가변 배열의 요소에는 배열이 사용됩니다. 요소를 구성하는 배열의 크기는 서로 다를 수 있으며 이 덕분에 일부 데이터 세트에 대한 공간을 절약할 수 있습니다. |
CA1815: 값 형식에서 Equals 또는 같음 연산자를 재정의하십시오. | 값 형식의 경우 Equals의 상속된 구현에서 Reflection 라이브러리를 사용하며 모든 필드의 내용을 비교합니다. Reflection에는 많은 계산이 요구되며 모든 필드의 일치 여부를 비교하는 것이 불필요할 수 있습니다. 사용자가 인스턴스를 비교 또는 정렬하거나 인스턴스를 해시 테이블 키로 사용할 것으로 예측되는 경우에는 값 형식에서 Equals를 구현해야 합니다. |
CA1819: 속성은 배열을 반환해서는 안 됩니다. | 속성에서 반환된 배열은 속성이 읽기 전용이더라도 쓰기 금지되지 않습니다. 배열을 무단으로 변경하지 못하도록 하려면 속성에서 배열의 복사본을 반환해야 합니다. 일반적으로 사용자는 이러한 속성을 호출할 경우 성능에 부정적인 영향을 준다는 것을 인식하지 못합니다. |
CA1820: 문자열 길이를 사용하여 문자열이 비었는지 테스트하십시오. | String.Length 속성이나 String.IsNullOrEmpty 메서드를 사용하여 문자열을 비교하는 것이 Equals를 사용하는 것보다 훨씬 더 빠릅니다. |
CA1821: 빈 종료자를 제거하십시오. | 개체 수명을 추적할 때에는 추가로 성능 오버헤드가 발생하므로 가능한 경우 종료자를 사용하지 마십시오. 빈 종료자는 어떠한 이점도 없이 오버헤드만 가중시킵니다. |
CA1822: 멤버를 static으로 표시하십시오. | 인스턴스 데이터에 액세스하지 않거나 인스턴스 메서드를 호출하지 않는 멤버는 static(Visual Basic의 경우 Shared)으로 표시할 수 있습니다. 메서드를 static으로 표시하면 컴파일러는 이러한 멤버에 대한 비가상 호출 사이트를 내보냅니다. 이 경우 성능이 중요한 코드에서 성능이 크게 향상될 수 있습니다. |
CA1823: 사용되지 않는 전용 필드를 사용하지 마십시오. | 어셈블리에서 액세스되지 않는 것으로 보이는 전용 필드가 발견되었습니다. |
CA1824: 어셈블리를 NeutralResourcesLanguageAttribute로 표시하십시오. | NeutralResourcesLanguage 특성은 어셈블리에 대한 중립 문화권의 리소스를 표시하는 데 사용된 언어를 Resource Manager에 알립니다. 이렇게 하면 로드한 첫 리소스에 대한 찾기 성능을 향상시킬 수 있으며 작업이 간단해집니다. |
CA1825: 길이가 0인 배열 할당 방지 | 길이가 0인 배열을 초기화하면 불필요한 메모리 할당이 발생합니다. 대신, Array.Empty를 호출하여 정적으로 할당된 빈 배열 인스턴스를 사용합니다. 메모리 할당은 이 메서드의 모든 호출에서 공유됩니다. |
CA1826: Linq 열거 가능 메서드 대신 속성 사용 | Enumerable LINQ 메서드가 동등하지만 더욱 효율적인 속성을 지원하는 형식에서 사용되었습니다. |
CA1827: Any를 사용할 수 있는 경우 Count/LongCount를 사용하지 마세요. | Any 메서드가 더욱 효율적인 위치에서 Count 또는 LongCount 메서드가 사용되었습니다. |
CA1828: AnyAsync를 사용할 수 있는 경우 CountAsync/LongCountAsync를 사용하지 마세요. | AnyAsync 메서드가 더욱 효율적인 위치에서 CountAsync 또는 LongCountAsync 메서드가 사용되었습니다. |
CA1829: Enumerable.Count 메서드 대신 Length/Count 속성을 사용합니다. | Count LINQ 메서드가 동등하지만 더욱 효율적인 Length 또는 Count 속성을 지원하는 형식에서 사용되었습니다. |
CA1830: StringBuilder에서 강력한 형식의 Append 및 Insert 메서드 오버로드를 선호합니다. | Append 및 Insert는 System.String 이외의 여러 형식에 대한 오버로드를 제공합니다. 가능하면 ToString() 및 문자열 기반 오버로드를 사용하는 대신 강력한 형식의 오버로드를 사용하는 것이 좋습니다. |
CA1831: 적절한 경우 문자열에 범위 기반 인덱서 대신 AsSpan 사용 | 문자열에 범위-인덱서를 사용하고 해당 값을 ReadOnlySpan<char> 형식에 암시적으로 할당하는 경우 Substring 메서드는 문자열의 요청된 부분 복사본을 생성하는 Slice 대신 사용됩니다. |
CA1832: 배열의 ReadOnlySpan 또는 ReadOnlyMemory 부분을 가져오기 위해 범위 기반 인덱서 대신 AsSpan 또는 AsMemory를 사용합니다. | 배열에 범위-인덱서를 사용하고 해당 값을 ReadOnlySpan<T> 또는 ReadOnlyMemory<T> 형식에 암시적으로 할당하는 경우 GetSubArray 메서드는 배열의 요청된 부분 복사본을 생성하는 Slice 대신 사용됩니다. |
CA1833: 배열의 범위 또는 메모리 부분을 가져오기 위해 범위 기반 인덱서 대신 AsSpan 또는 AsMemory를 사용합니다. | 배열에 범위-인덱서를 사용하고 해당 값을 Span<T> 또는 Memory<T> 형식에 암시적으로 할당하는 경우 GetSubArray 메서드는 배열의 요청된 부분 복사본을 생성하는 Slice 대신 사용됩니다. |
CA1834: 단일 문자열에 StringBuilder.Append(char) 사용 | StringBuilder에는 char 을 인수로 사용하는 Append 오버로드가 있습니다. 성능 향상을 위해 char 오버로드를 호출하는 것이 좋습니다. |
CA1835: ‘ReadAsync’ 및 ‘WriteAsync’에 ‘메모리’ 기반 오버로드를 사용하세요 | ‘Stream’에 첫 번째 인수로 ‘Memory<Byte>’를 사용하는 ‘ReadAsync’ 오버로드와 첫 번째 인수로 ‘ReadOnlyMemory<Byte>’를 사용하는 ‘WriteAsync’ 오버로드가 있습니다. 더 효율적인 메모리 기반 오버로드를 호출하는 것이 좋습니다. |
CA1836: 사용 가능한 경우 Count 대신 IsEmpty 를 사용하세요 |
개체에 항목이 포함되는지를 확인하는 데는 Count , Length , Count<TSource>(IEnumerable<TSource>) 또는 LongCount<TSource>(IEnumerable<TSource>)보다 더 효율적인 IsEmpty 속성을 사용하는 것이 좋습니다. |
CA1837: Process.GetCurrentProcess().Id 대신 Environment.ProcessId 를 사용하세요 |
Environment.ProcessId 는 Process.GetCurrentProcess().Id 보다 더 간단하고 더 빠릅니다. |
CA1838: P/Invokes에 StringBuilder 매개 변수를 사용하지 마세요 |
마샬링은 StringBuilder 항상 네이티브 버퍼 복사본을 만들어 하나의 마샬링 작업에 여러 할당합니다. |
CA1839: Process.GetCurrentProcess().MainModule.FileName 대신 Environment.ProcessPath 사용 | Environment.ProcessPath 는 Process.GetCurrentProcess().MainModule.FileName 보다 더 간단하고 더 빠릅니다. |
CA1840: Thread.CurrentThread.ManagedThreadId 대신 Environment.CurrentManagedThreadId 사용 | Environment.CurrentManagedThreadId 는 Thread.CurrentThread.ManagedThreadId 보다 간단하고 효율적입니다. |
CA1841: 사전 Contains 메서드 사용 | Keys 또는 Values 컬렉션에서 Contains 를 호출하면 사전 자체에서 ContainsKey 또는 ContainsValue 를 호출하는 것보다 비용이 더 많이 들 수 있습니다. |
CA1842: 단일 작업에서 'WhenAll'을 사용하지 마세요. | 단일 작업과 함께 사용하면 WhenAll 성능이 저하될 수 있습니다. 대신 작업을 대기하거나 반환합니다. |
CA1843: 단일 작업에서 'WaitAll'을 사용하지 마세요. | 단일 작업과 함께 사용하면 WaitAll 성능이 저하될 수 있습니다. 대신 작업을 대기하거나 반환합니다. |
CA1844: 'Stream'을 서브클래싱할 때 비동기 메서드의 메모리 기반 재정의 제공 | 성능을 향상하려면 'Stream'을 서브클래싱할 때 메모리 기반 비동기 메서드를 재정의합니다. 그런 다음, 메모리 기반 메서드를 기준으로 배열 기반 메서드를 구현합니다. |
CA1845: 범위 기반 ‘string.Concat’을 사용하세요. | Substring 및 연결 연산자 대신 AsSpan 및 string.Concat 을 사용하는 것이 더 효율적입니다. |
CA1846: Substring 보다 AsSpan 선호 |
AsSpan 이 Substring 보다 더 효율적입니다. Substring 은 O(n) 문자열 복사를 수행하지만 AsSpan 은 복사를 수행하지 않으며 상수 비용을 포함합니다. 또한 AsSpan 은 힙 할당을 수행하지 않습니다. |
CA1847: 단일 문자 조회에 char 리터럴 사용 | 단일 문자를 검색할 때 String.Contains(string) 대신 String.Contains(char) 를 사용합니다. |
CA1848: LoggerMessage 대리자 사용 | 성능 향상을 위해 대리자를 LoggerMessage 사용합니다. |
CA1849: 비동기 메서드에 있을 때 비동기 메서드 호출 | 이미 비동기인 메서드에서 다른 메서드에 대한 호출은 각각의 비동기 버전(있는 경우)에 대한 호출이어야 합니다. |
CA1850: ComputeHash 보다 정적 HashData 메서드 선호 |
ComputeHash 를 호출하기 위해 HashAlgorithm 인스턴스를 만들고 관리하는 것보다 정적 HashData 메서드를 사용하는 것이 더 효율적입니다. |
CA1851: IEnumerable 컬렉션의 여러 열거 가능 |
컬렉션의 IEnumerable 가능한 여러 열거형입니다. 여러 열거를 방지하는 구현을 사용하는 것이 좋습니다. |
CA1852: 내부 형식 봉인 | 어셈블리 외부에서 액세스할 수 없고 포함된 어셈블리 내에 하위 형식이 없는 형식은 봉인되지 않습니다. |
CA1853: 'Dictionary.ContainsKey(key)'에 대한 불필요한 호출 | Dictionary.Remove(key) 는 Dictionary.ContainsKey(key) 로 보호하지 않아도 됩니다. Dictionary<TKey,TValue>.Remove(TKey)는 키가 이미 있는지 여부를 확인하고 키가 없으면 throw하지 않습니다. |
CA1854: 'IDictionary.TryGetValue(TKey, out TValue)' 메서드를 선호합니다. | 'ContainsKey' 확인으로 보호되는 사전 인덱서 액세스보다 'TryGetValue'를 선호합니다. 'ContainsKey'와 인덱서는 모두 키를 조회하므로 'TryGetValue'를 사용하면 추가 조회가 방지됩니다. |
CA1855: Span<T>.Fill() 대신 Span<T>.Clear() 사용 | Span<T>.Fill(T)를 호출하여 범위의 요소를 기본값으로 채우는 것보다 Span<T>.Clear()를 호출하는 것이 더 효율적입니다. |
CA1856: ConstantExpected 특성의 잘못된 사용 | ConstantExpectedAttribute 매개 변수에 특성이 올바르게 적용되지 않습니다. |
CA1857: 매개 변수는 최적의 성능을 위해 상수를 기대합니다. | 잘못된 인수가 주석이 추가된 매개 변수에 전달됩니다 ConstantExpectedAttribute. |
CA1858: IndexOf 대신 StartsWith 사용 | 문자열이 지정된 접두사로 시작하는지 여부를 확인하기 위해 호출하는 것보다 호출 String.StartsWith String.IndexOf 하는 것이 더 효율적입니다. |
CA1859: 성능 향상을 위해 가능한 경우 구체적인 형식 사용 | 코드는 인터페이스 형식 또는 추상 형식을 사용하므로 불필요한 인터페이스 호출 또는 가상 호출이 발생합니다. |
CA1860: 'Enumerable.Any()' 확장 메서드를 사용하지 마세요. | 컬렉션 형식에 요소가 있는지 여부를 확인하기 위해 호출 Enumerable.Any 하는 Length Count 것보다 사용하거나 IsEmpty (가능한 경우) 사용하는 것이 더 효율적이고 명확합니다. |
CA1861: 상수 배열을 인수로 사용하지 않습니다. | 인수로 전달된 상수 배열은 다시 사용되지 않으므로 성능 오버헤드를 의미합니다. 성능을 향상시키려면 '정적 읽기 전용' 필드에 추출하는 것이 좋습니다. |
CA1862: ‘StringComparison’ 메서드 오버로드를 사용하여 대/소문자를 구분하지 않는 문자열 비교를 수행합니다. | 코드가 대/소문자를 구분하지 않는 문자열 비교를 호출 ToLower() 하거나 ToUpper() 수행하면 불필요한 할당이 수행됩니다. |
CA1863: ‘CompositeFormat’ 사용 | 서식 비용을 줄이려면 인스턴스를 인수 String.Format StringBuilder.AppendFormat 로 캐시하고 사용합니다CompositeFormat. |
CA1864: 'IDictionary.TryAdd(TKey, TValue)' 메서드를 선호합니다. | Dictionary<TKey,TValue>.Add 둘 다 Dictionary<TKey,TValue>.ContainsKey(TKey) 중복되는 조회를 수행합니다. 값이 추가되었는지 여부를 나타내는 값을 반환 bool 하는 호출Dictionary<TKey,TValue>.TryAdd이 더 효율적입니다. TryAdd 는 키가 이미 있는 경우 키의 값을 덮어쓰지 않습니다. |
CA1865-CA1867: char 오버로드 사용 | char 오버로드는 단일 문자가 있는 문자열에 대해 더 나은 성능 오버로드입니다. |
CA1868: 집합에 대한 'Contains'에 대한 불필요한 호출 | ICollection<T>.Remove(T) 둘 다 ISet<T>.Add(T) 조회를 수행하므로 미리 호출 ICollection<T>.Contains(T) 하는 것이 중복됩니다. 항목이 추가 또는 제거되었는지 여부를 나타내는 부울 값을 반환하는 호출 또는 Remove(T) 직접 호출 Add(T) 이 더 효율적입니다. |
CA1869: 'JsonSerializerOptions' 인스턴스 캐시 및 재사용 | System.Text.Json은 내부적으로 serialization 관련 메타데이터를 제공된 인스턴스에 캐시하므로 코드가 여러 번 실행되는 경우 직렬화 또는 역직렬화에 로컬 인스턴스 JsonSerializerOptions 를 사용하면 애플리케이션 성능이 크게 저하될 수 있습니다. |
CA1870: 캐시된 'SearchValues' 인스턴스 사용 | 캐시된 SearchValues<T> 인스턴스를 사용하면 값을 'IndexOfAny' 또는 'ContainsAny'에 직접 전달하는 것보다 더 효율적입니다. |
CA1871: nullable 구조체를 'ArgumentNullException.ThrowIfNull'에 전달하지 마세요. | 'ArgumentNullException.ThrowIfNull'은 'object'를 허용하므로 null 허용 구조체를 전달하면 값이 boxed될 수 있습니다. |
CA1872: 'BitConverter.ToString'을 기반으로 하는 호출 체인보다 'Convert.ToHexString' 및 'Convert.ToHexStringLower' 선호 | 바이트를 16진수 문자열 표현으로 인코딩하는 경우 또는 Convert.ToHexStringLower 사용합니다Convert.ToHexString. 이러한 메서드는 대시 String.ToLower및 을 대체하는 데 함께 String.Replace 사용하는 BitConverter.ToString 것보다 더 효율적이고 할당 친화적입니다. |
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET