메인페이지 . 바뀐페이지 .

\cat CsReference

참여자: uskusi

C# Coding

Performance
토론

틈나는 대로 C#다운 코딩은 무엇인가에 대해서 정리합니다. Tip&Tech 의 성격을 지닌 페이지입니다. 머리를 식힐겸 한번씩 보면서 아는것을 정리해나가도록 합니다.

Performance

1. 문자열비교는 쓸데 없는 작업을 많이 하게 된다. 만약 문자열이 비어있는지 검사하는 경우에는 length property 를 쓰는것이 좋다.

// not recommended
if (str != "") 
// 이것이 C나 PHP에서 쓰던 전통적인 방식이다. C# 에서는 이 방법대신 length method를 사용할 것을 권유한다.

// recommended
if (str.length > 0)

2. 1번과 연계되는 내용으로서 문자열이 일치하는지 확인할때 Equals 메서드를 사용한다.

String str1 = "str1";
String str2 = "str2";

// not recommended
if (str1 == str2) { code }
// 이것이 C나 PHP에서 쓰던 전통적인 방식이다. C# 에서는 이 방법대신 Equals Method를 사용할 것을 권유한다.

// recommended
if (str1.Equals(str2)) { code }

3. C#의 문자열은 원칙적으로 변경 불가능하다. 변경명령을 받을때는 Heap 내의 새로운 영역에 메모리를 확보하고 변경, 할당후에 해당 변수의 해시코드를 변경하는 작업이 이루어진다. 만약 문자열을 변경하려고 한다면,

따라서 StringBuilder를 사용하는 편이 낫다.(고는 하지만 몇가지 논란이 있다. 마지막에 다루기로 한다.)

// not recommended
String str;
str = "This is a string.";
str = str + " This is an appended string."; // 또는 str += " This is an appended string."; 

이것이 C나 PHP에서 쓰던 전통적인 방식이다.

// recommended
StringBuilder str = new StringBuilder("This is a string.");
str.Append(" This is an appended string.");

일반적인 경우에 아래 소스에서 Overhead가 덜 걸린다.

StringBuilder는 버퍼를 미리 잡아놓고 시작하기 때문에 문자열 연결과 같은 작업이 일어날 때 빈공간에 바로 투입할 수 있고, 메모리를 새로 Allocate하고 복사하는등의 불필요한 작업을 하지 않는다.

StringBuilder 클래스를 살펴보면 int capacity 를 매개변수로 받는 오버라이딩 메서드가 있는데 이것이 버퍼의 크기를 잡아주는 역할을 한다. 버퍼의 크기를 너무 적게 잡으면 string 이 하는짓을 그대로 반복할 것이고, 버퍼의 크기를 너무 크게 잡으면 메모리의 낭비를 초래한다. 적절히 capacity 값을 조절해 주면서 쓰는것이 옳다.

토론

C#에서 권장하는 표준코딩을 설명하는 챕터이니만큼 자주 보게 될 것입니다. 권장하는 각 코드에 대한 출처를 알 수 있으면 좋겠습니다. 예를 들어 Equals() 메서드 사용의 경우 속도면에서 이것을 권장하는 것인지 아니면 다른 무슨 이유가 있는 것인지 궁금한데 원출처를 알면 더 자세한 이유를 알 수 있겠지요. -- HuidaeCho

편집 . 바뀐부분 . 역링크 .
2024년 4월 7일 오전 8:29:50 . XHTML 1.1 . CSS 3 . 용쓴다. !
이 사이트의 모든 문서는 크리에이티브 커먼즈 라이센스를 따릅니다.