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

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

댓글(8)

  • 2021.12.27 17:20 신고

    번역은 잘하신거 같은데. 약간에 거슬리는 부분이 있네요. 2014 릴리즈된 버전부터 null conditional operator가 사용가능한데, 블로그 작성 날자가 2018 년이네요. 2018년대 사람이면 if(object1?.runMethod()) 일텐데요?

    • 2021.12.29 09:05 신고

      안녕하세요. 블로그 이전하면서 이전 글 그대로 복붙했습니다. 그래서 작성 날짜 대비 거슬리는 부분이 적힌 글이 좀 많아요. 이 글도 그 중 하나입니다.

      블로그 이전하면서 올린 게 2018년이라, 원래는 몇년도에 적은 건진 저도 모르겠습니다.

  • 2021.12.29 12:29 신고

    검색해서 들어온 사람들이 본인의 그런 사정을 어떻게 알 수 있나요?
    뭐랄까.. 새 부대에는 새 포도주를 담는 것이 인지상정인데,
    썩은 포도주를 마신 기분이네요.

    저도 블로그에 글을 작성하는 자의 입장으로서 감히 몇 마디 하겠습니다.
    블로그에 열심히 글을 작성하려는 사람의 마음이.
    다른 사람에게 잘못된 정보가 전달될까 염려하는 마음이.
    공백 하나 철자 하나 틀리지 않았나 자꾸 확인하는 마음이.
    이렇게 무심하게 관리되는 글이 상위 검색에 노출된다는 것에
    한없이 걸래 짝이 될 수도 있다는 것을 알아주셨으면 합니다.

    • 2021.12.29 14:18

      걍 좀 가라
      말을 싸대기 마렵게 하네

    • 2022.01.02 17:54 신고

      난 이렇게 살지 말아야겠다는 생각으로 이 댓글 놔두겠습니다.

    • 2022.01.19 09:03

      염려하시는 것 치고는 걸래와 걸레는 구분 못하시네요

  • 2022.01.02 20:05 신고

    내 글 보기가 역겨워 답글 다실적에는 말없이 고이 삭제하려 했지만
    긍정적으로 생각해 주시니, 반면교사라도 된 듯이 기쁩니다😊
    그 생각 잃지 마시고
    하늘을 우러러 한 점 부끄러움 없는 포스팅하시길 바랍니다🙃

    "Code is poetry"

    • 2022.01.11 10:54

      그건 당신이 시인이라거나 감성적인 것이 아니라

      타인에게 정신병리적 위해를 가하고 그 결과를 보존하고 싶어하는 심리가 있다는 뜻입니다.

      네, 당신은 정신병이 있습니다.
      부끄러워 마십쇼, 적절한 수술과 약물로 충분히 호전될 수 있습니다.

Designed by JB FACTORY