티스토리 뷰
목차
C# 속도 최적화 9가지, 성능 튜닝 방법
타입 유추
일반적으로 C#에선 아래와 같이 (최적화 되기 전) 정의합니다.
1 | string MyString = “Hello World”; | cs |
=의 우측에 하나의 데이터 타입(string)을 적어 선언하는 건 일반적입니다. (속도 또한 일반적) 근데, 이런 작업을 컴파일러가 대신하여 개선할 순 없을까요?
1 | var MyString = “Hello World”; | cs |
바로 위의 코드 또한 〈MyString〉라는 C# 문자열 변수를 생성합니다. 일반적인 상황에서 유추(inference)를 통해 처리 성능이 향상되진 않습니다. 컴파일 시, 어떤 작업 과정이든 데이터 타입을 먼저 생각하진 않습니다.
아래 예를 통해 유추를 알아볼 수 있습니다.
1 2 3 4 | var SeniorStaff = Employees.Where(s => s.Age > 35); foreach(var Member in SeniorStaff) Console.WriteLine("Name: {0} Age: {1}",Member.Name,Member.Age); | cs |
람다 표현식(Lambda)
코드를 읽기에 난해하다는 단점이 있으나 내부적으로 구동하는 데 있어선 좋은 최적화 방법입니다.
1 | Func mySeniorStaffFilter = delegate(int a) { return a > 35; }; | cs |
위의 코드에선 직원 수가 35보다 많다면 True를 반환합니다. 람다 표현식으로는 간결하고 (여기서는) 읽기 쉽습니다. 같은 의미라도 가독성은 개선되죠.
1 | Func mySeniorStaffFilter = a => a > 35; | cs |
델리게이트를 이용하면 C# 코드를 꾸밀 수 있습니다.
1 | var SeniorStaff = Employees.Where(s => s.Age > 35); | cs |
[C# 속도 최적화 9가지, 성능 튜닝 방법]
string.IsNullOrEmpty
문자열이 비었는지 확인하려면 string.IsNullOrEmpty 함수를 사용해서 반환 값을 확인하세요.
1 2 3 4 | if (String.IsNullOrEmpty(s) == true) return "is null or empty"; else return String.Format("(\"{0}\") is not null or empty", s); | cs |
문자열의 대소문자 구분
때로는 Case(형식, 형태 등 변수의 속성)를 무시하는 문자열 비교 방법이 필요합니다. 일반적 또는 전통적으로 문자열 비교 시 전체를 대문자나 소문자로 변환하여 처리합니다.
1 | str1.ToLower() == str2.ToLower() | cs |
그렇지만 반복적으로 이용하면, 퍼포먼스 병목 현상이 벌어집니다. 대신 C# String.Compare() 함수를 사용하면 프로그램의 수행 속도를 향상하여 최적화할 수 있습니다. 두 개의 문자열을 비교하면서 단순한 Case들은 무시합니다.
1 | string.Compare(str1, str2, true) == 0 //Ignoring cases | cs |
0이 반환된다면 두 문자열은 서로 같다는 뜻입니다. 개선되네요.
ArrayList를 List<>로 교체하기
ArrayList는 여러 종류의 개체들을 다루기에 좋습니다. 그렇지만, ArrayList에 삽입되는 개체(변수)가 같은 타입이라면 ArrayList를 List<>로 교체해 성능을 향상합니다.
1 2 3 4 | ArrayList intList = new ArrayList(); intList.add(10); return (int)intList[0] + 20; | cs |
위 소스 코드의 C# 변수 유형만 변경해 줍니다.
1 2 3 4 | List<int> intList = new List<int>(); intList.add(10) return intList[0] + 20; | cs |
변수 타입을 별도로 캐스트할 필요가 없습니다. 최적화로 성능 향상을 꾀할 수 있는 부분은 Integer와 같은 기본 데이터 타입들입니다.
[C# 속도 최적화 9가지, 성능 튜닝 방법]
&&와 || 사용하기
빌드할 땐 간단하게, &&, ||를 사용해 보세요(Visual Basic에서는 AndAlso, OrElse). 코드가 줄어들고, 이 적은 코드는 향상된 성능뿐만 아니라 런타임 오류를 방지할 수도 있습니다.
아래는 간단한 예입니다.
1 | if (object1 != null && object1.runMethod()) | cs |
object1은 NULL일 경우 object1.runMethod()가 실행되지 않습니다.
언제 StringBuilder를 사용해야 할까요?
StringBuilder 객체는 일반 문자열 함수보다 「더 빠른 문자열 처리 속도」를 보유하고 있습니다. StringBuilder는 긴 문자열을 처리하는데 좋은 클래스입니다. 문자열로 처리할 수 있는 부분을 StringBuilder로 대체하면 C# 소스 코드가 더 적은 리소스를 사용하고 가독성도 높아집니다. 문자열과 StringBuilder 객체를 효율적으로 사용함으로써 소스 코드를 최적화할 수 있습니다.
[고급 프로그래밍 팁]
똑똑한 Try-Catch
예를 들면, 웹이나 디바이스에 접근하는 예외를 프로그래머가 제어하기 위해 사용됩니다. 하지만, Try-Catch문 때문에 소스 코드의 수행 시간은 늘어지니, Try-Catch문은 단순하게 구성해 개선해야 합니다.
Replace Division
C#에선 Division의 Replace가 상대적으로 느립니다. C# 소스 코드를 최적화하기 위해 Multiplication-shift operation 부분을 다른 방식으로 대체하는 겁니다.
출처 1 - 10 C# Shorthands that improve productivity (링크 깨짐)
출처 2 - 7 Ways To Optimize C# Code
C# 속도 최적화 9가지, 성능 튜닝 방법