C#에서 문자열을 연산하는 경우에는 + 연산자 string.Format문등을 사용해서 손쉽게 사용할 수 있습니다. 이 경우에는 연산을 할때마다 새로운 개체를 생성해서 할당을 하게되어있습니다.
StringBuilder와 String연산 속도차이 코드
StringBuilder를 사용하는 경우와 +연산자를 사용해서 String을 결합 했을경우에 대한 속도차이를 비교하는 소스코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
using System;
using System.Text; //StringBuilder
using System.Diagnostics; //StopWatch
namespace StringBuildTester
{
internal class Program
{
static void Main(string[] args)
{
const int REPEAT_COUNT = 1000;
string result = string.Empty;
Console.WriteLine("Compare String StringBuilder Speed");
Console.WriteLine($"RepeatCount:{REPEAT_COUNT}");
Console.WriteLine();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < REPEAT_COUNT; i++)
{
result += i.ToString() + " ";
}
stopwatch.Stop();
TimeSpan ts = stopwatch.Elapsed;
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:0000}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds);
Console.WriteLine("String RunTime:" + elapsedTime);
StringBuilder sb = new StringBuilder(4096);
stopwatch.Reset();
stopwatch.Start();
for (int i = 0; i < REPEAT_COUNT; i++)
{
sb.Append(i.ToString());
sb.Append(" ");
}
stopwatch.Stop();
ts = stopwatch.Elapsed;
elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:0000}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds);
Console.WriteLine("StringBuilder RunTime:" + elapsedTime);
}
}
}
|
StringBuilder Capacity 속성값
위 소스코드중에 StringBuilder 생성시 4096이라는 값을 넣었습니다. StringBuilder sb =newStringBuilder(4096);
Capacity속성값으로 메모리에 포함할 수 있는 최대 문자 수를 설정 할 수 있습니다. 해당부분을 먼저 선언을 해놓기 때문에 Append함수를 호출하여도 별도의 개체를 생성하지 않고 이어서 문자열을 붙이기 때문에 성능이 String보다 좋습니다. 4096을 초과하는 경우에는 자동적으로 클래스내부에서 메모리를 늘려줍니다.
반복횟수에 따른 처리속도 결과값
REPEAT_COUNT값을 100회, 1000회, 10000회, 30000회로 바꾸어서 속도를 측정해보았습니다. 속도를 측정하기 위해서 stopwatch클래스를 사용했습니다. 100회 반복해서 연산을 했을경우는 속도차이가 거의 나지 않습니다. 10000회의 경우 55배의 차이 30000회의경우는 210배정도의 차이가 납니다. 이처럼 반복회수가 많아지면 질수록 성능에 차이가 발생하므로 string연산이 많이 이루어지는곳에는 StringBuilder클래스를 사용해서 사용하는것이 좋습니다.
참고
StopWatch: https://docs.microsoft.com/ko-kr/dotnet/api/system.diagnostics.stopwatch?view=net-6.0
StringBuilder: https://docs.microsoft.com/ko-kr/dotnet/standard/base-types/stringbuilder
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 서비스프로그램 만들기 (0) | 2022.10.22 |
---|---|
[C#] Base64인코딩/디코딩 , Http Basic Auth (0) | 2022.10.07 |
[C#] 문자열 포멧처리방법 (+, string.Format,$문자열보간) (1) | 2022.03.23 |
[C#] 비트연산 (AND,OR,XOR,NOT,SHIFT) (0) | 2022.02.21 |
[C#] 2진수,8진수,10진수,16진수로 출력하기 (0) | 2022.02.20 |