21 August 2015

C# StringBuilder เหนือกว่าต่อ string ธรรมดา

    เวลาเขียนโปรแกรมแล้วมีการต่อ string หลายๆคนอาจจะคุ้นชินกับการเขียนแบบ text = text + newText หรือ text += newText ส่วนตัวผมจะเขียนแบบหลังซะส่วนใหญ่ แต่ถ้าเวลาที่เราต้องเจอเคสที่ต้องต่อ string จำนวนมากๆเข้า ก็จะเริ่มรู้สึกว่าโปรแกรมเราทำงานช้าลง แต่มันยังมีอีกวิธีที่บางคนอาจจะยังไม่ทราบหรือเคยเห็นแล้วแต่ก็ไม่ได้สนใจอะไร นั่นคือการใช้คลาส StringBuilder คราวนี้ผมจะลองเขียนเปรียบเทียบระหว่างการใช้คลาส StringBuilder กับการต่อ string ธรรมดาที่เราคุ้นชินโดยจะมีการจับเวลาของการทำงานในแต่ละแบบ ดัง code ตัวอย่างครับ
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch sw1 = new Stopwatch();
            sw1.Start();
            UseStringBuilderClass();
            sw1.Stop();
            Console.WriteLine("UseStringBuilderClass " + sw1.ElapsedMilliseconds + " ms.");

            Stopwatch sw2 = new Stopwatch();
            sw2.Start();
            NotUseStringBuilderClass();
            sw2.Stop();
            Console.WriteLine("NotUseStringBuilderClass " + sw2.ElapsedMilliseconds + " ms.");

            Console.ReadKey();
        }

        static void UseStringBuilderClass()
        {
            StringBuilder str = new StringBuilder();
            for (int i = 0; i < 100000; i++) str.Append(i);
        }

        static void NotUseStringBuilderClass()
        {
            string str = "";
            for (int i = 0; i < 100000; i++) str += i;
        }
    }
}
    จากผลลัพธ์จะเห็นว่าการใช้คลาส StringBuilder มีความไวกว่าการต่อ string ธรรมดา แต่ถ้าในกรณีที่เราไม่ได้ต่อ string จำนวนมากๆแล้ว ก็ไม่จำเป็นที่จะต้องใช้คลาสนี้ก็ได้ครับเขียนแบบธรรมดาไปเลยง่ายกว่า การเลือกใช้ต้องขึ้นอยู่กับว่าข้อมูลของเราว่ามีมากแค่ไหน