티스토리 뷰

목차

    반응형

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

    반응형