[C# 활용] String, StringBuilder 성능 차이

소개

안녕하세요.

오늘은 C# 을 사용하면서 정말 많이 다루는 타입인 문자열(String, StringBuilder) 에 대해서 알려 드리려고 합니다.

그 중에서도 팁? 이라면 팁인 String과 StringBuilder 중 어느것을 활용하는게 좋은지? 에 대한 개인적인 답을 드리려고 합니다.

이미 아시는 분들은 아시겠지만, 여러개의 문자열을 연결할 때에는 String 보다는 StringBuilder 를 이용하는것이 성능에 더 좋다고 알고 있을 것입니다.

실제로 정말 모든 문자열을 연결할 상황일 때 StringBuilder가 String 보다 매번 성능이 우수한지 한번 확인해 보겠습니다.


문자열이 많은 경우

  • 다음과 같이 String, StringBudiler 에 문자열 테스트 진행합니다. 라는 문자열을 1000번 연결하는 메서드를 각각 생성해서 벤치마크 테스트를 진행하였습니다.
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System.Text;

namespace BenchMarkTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var summary = BenchmarkRunner.Run<BenchMarkTest>();
        }
    }

    [MemoryDiagnoser]
    [MarkdownExporter]
    public class BenchMarkTest
    {

        [Benchmark]
        public void StringTest()
        {
            string str = null;
            for (int index = 0; index < 1000; index++)
            {
                str += "문자열 테스트 진행합니다.";
            }
        }

        [Benchmark]
        public void StringBuilderTest()
        {
            StringBuilder str = new StringBuilder();
            for (int index = 0; index < 1000; index++)
            {
                str.Append("문자열 테스트 진행합니다.");
            }
        }
    }
}

실행 결과

  • 실행 결과, StringBuilderTest 메서드가 StringTest 메서드에 비해 월등히 빠른것을 확인하실 수 있습니다.
|            Method |      Mean |    Error |   StdDev |     Gen 0 |   Gen 1 | Allocated |
|------------------ |----------:|---------:|---------:|----------:|--------:|----------:|
|        StringTest | 901.17 us | 4.696 us | 4.393 us | 2672.8516 | 11.7188 | 13,712 KB |
| StringBuilderTest |  17.68 us | 0.104 us | 0.093 us |    6.2561 |  0.6104 |     32 KB |

문자열이 적은 경우

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System.Text;

namespace BenchMarkTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var summary = BenchmarkRunner.Run<BenchMarkTest>();
        }
    }

    [MemoryDiagnoser]
    [MarkdownExporter]
    public class BenchMarkTest
    {

        [Benchmark]
        public void StringTest()
        {
            string str = null;
            for (int index = 0; index < 3; index++)
            {
                str += "문자열 테스트 진행합니다.";
            }
        }

        [Benchmark]
        public void StringBuilderTest()
        {
            StringBuilder str = new StringBuilder();
            for (int index = 0; index < 3; index++)
            {
                str.Append("문자열 테스트 진행합니다.");
            }
        }
    }
}

실행 결과

  • 연결할 문자열이 적은 경우에는, 오히려 StringBuilder보다 String으로 문자열 연결하는 방법이 더 빠른것으로 성능 측정이 되었습니다.
|            Method |      Mean |    Error |   StdDev |  Gen 0 | Allocated |
|------------------ |----------:|---------:|---------:|-------:|----------:|
|        StringTest |  93.80 ns | 1.605 ns | 1.648 ns | 0.0328 |     172 B |
| StringBuilderTest | 124.51 ns | 0.720 ns | 0.674 ns | 0.0472 |     248 B |

정리

  • 연결할 문자열이 많은 경우에는 StringBuilder 가 String 보다 월등히 성능이 좋습니다.
  • 하지만, 연결한 문자열이 적은 경우에는 String을 사용하는게 좋다고 생각합니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY