본문 바로가기
C++ 200제/코딩 IT 정보

C# 처리 속도 개선과 최적화 9가지 방법, 성능 튜닝 팁

by vicddory 2018. 10. 7.

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가지 방법 (Visual Studio 속도)[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# 비주얼 스튜디오 속도[C# 속도 최적화 9가지, 성능 튜닝 방법]




&&와 || 사용하기


빌드할 땐 간단하게, &&, ||를 사용해 보세요(Visual Basic에서는 AndAlso, OrElse). 코드가 줄어들고, 이 적은 코드는 향상된 성능뿐만 아니라 런타임 오류를 방지할 수도 있습니다.


아래는 간단한 예입니다.


1
if (object1 != null && object1.runMethod())
cs


object1은 NULL일 경우 object1.runMethod()가 실행되지 않습니다.




언제 StringBuilder를 사용해야 할까요?


StringBuilder 객체는 일반 문자열 함수보다 「더 빠른 문자열 처리 속도」를 보유하고 있습니다. StringBuilder는 긴 문자열을 처리하는데 좋은 클래스입니다. 문자열로 처리할 수 있는 부분을 StringBuilder로 대체하면 C# 소스 코드가 더 적은 리소스를 사용하고 가독성도 높아집니다. 문자열과 StringBuilder 객체를 효율적으로 사용함으로써 소스 코드를 최적화할 수 있습니다.


C# 처리 속도 개선과 최적화 9가지 방법, 성능 튜닝 팁[고급 프로그래밍 팁]




똑똑한 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가지, 성능 튜닝 방법