[Programming] รวมเทคนิค Optimize Code ให้มีประสิทธิภาพดียิ่งขึ้น

สวัสดีเพื่อนๆ พบกันอีกแล้ว บล็อกนี้จะเขียนเรื่องการเพิ่มประสิทธิภาพโค๊ดให้ทำงานได้ดี และจะส่งผลให้โปรแกรมของเราเร็วขึ้น และใช้ทรัพยากรลดลงนั่นเอง โดยที่ตัวอย่างแอดมินจะใช้เป็นภาษา C# ก็แล้วกัน แต่ว่าหลักการก็จะคล้ายๆกันเกือบทุกภาษานั่นแหละ ไปดูกันเล๊ยย



1. รู้จักกับ String และ String Builder

สำหรับ StringBuilder มันคือชนิดของข้อมูลชนิดหนึ่งซึ่งมีความสามารถในการต่อ String ที่มีความยาวมากๆได้รวดเร็วกว่าตัวแปร String ธรรมดา โดยหลักการการต่อ String ของ String ธรรมดาคือ การสร้างตัวแปรใหม่ในชื่อเดิม ยกตัวอย่างเช่น เราสร้าง String a = "Hello"; ต่อมาต้องการเพิ่มให้ a = "Hello" + " Admin" นี่แหละครับ มันคือการสร้างตัวแปร a ขึ้นมาใหม่โดยที่ a = "Hello" ก็ยังคงสร้างอยู่ใน Memory ลองนึกถึงการต่อ String ยาวๆดูสิ จะเกิด Temp ขยะเยอะมาก

แต่ใช่ว่าจะให้เลิกใช้ String ธรรมดานะครับ คือต้องเลือกใช้ ถ้าเป็นข้อความสั้นๆ ไม่ยาวนักใช้ String จะเหมาะสมกว่าและมีประสิทธิภาพดีกว่า

ลองทดสอบความเร็วในการใช้งานทั้งสองแบบด้วยวิธีนี้ครับ

using System;
using System.Diagnostics;
using System.Text;
 
namespace StringBuilder
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch sw1 = new Stopwatch();
            string fooString1 = String.Empty;
            sw1.Start();
            for (int i = 0; i < 500000; i++)
            {
                fooString1 += i.ToString();
            }
            sw1.Stop();
            string sw1time = sw1.ElapsedMilliseconds;
            Console.WriteLine("[Normal] Process time :"
            + sw1time  + " ms.");
 
            Stopwatch sw2 = new Stopwatch();
            StringBuilder fooString2 = new StringBuilder();
            sw2.Start();
            for (int i = 0; i < 500000; i++)
            {
                fooString2.Append(i.ToString());
            }
            sw2.Stop();
            string sw2time = sw2.ElapsedMilliseconds;
            Console.WriteLine("[StringBuilder] Process time :"
            + sw2time  + " ms.");
            Console.ReadKey();
        }
    }
}

2. Comparing Non-Case-Sensitive Strings

เวลาที่เราต้องการเปรียบเทียบ String ที่สามารถให้เป็นตัวใหญ่หรือตัวเล็กก็มีค่าเท่ากัน เรามักจะใช้

str1.ToLower() == str2.ToLower()

ซึ่งจะเห็นได้ว่าเราต้องเรียก ToLower() ถึง 2 ครั้ง การจะทำให้โค๊ดมีประสิทธิภาพขึ้น ทำแบบนี้ครับ

string.Compare(str1, str2, true) == 0 //Ignoring cases

โดยมันจะคืนค่า 0 เมื่อ String ทั้งสองมีค่าเท่ากัน

3. Use string.Empty

เมื่อต้องการเปรียบเทียบค่าว่าง ปกติเรามักจะใช้

if (str == "")

ลองเปลี่ยนมาใช้ String.Empty แบบนี้ครับ

if (str == String.Empty)

เราสามารถ Check ค่าว่างด้วยวิธีเปรียบเทียบ String.length ว่าเท่ากับ 0 หรือเปล่าก็ได้ครับ เร็วกว่าเปรียบเทียบ String ด้วย

4. Replace ArrayList with List<>

ใครที่เขียนโปรแกรมมาสักระยะ คงรู้จัก ArrayList กับ List กันดี ข้อแตกต่างของทั้งสองประเภทนี้คือ ArrayList สามารถเก็บข้อมูลได้หลายชนิด ต่างกับ List<type> ที่เราสามารถเก็บได้เฉพาะชนิดที่ระบุ ดังนั้นถ้าเราต้องการเก็บตัวแปรแค่ชนิดเดียวตายตัว ก็ใช้ List<> ไปเลยจะดีกว่า เพราะมันจะเร็วกว่าครับ

5. Smart Try-Catch

พยายามใช้ Try-Catch เท่าที่จำเป็น ให้ใช้กับพวกการติดต่อ Database หรือฟังก์ชันที่อาจเกิด Error โดยไม่ทราบสาเหตุได้ อะไรพวกนี้จะเหมาะสมที่สุด นอกนั้นให้ใช้ if เอาครับ

6. "Else" clause removal

ลดการใช้ else ลง

Before

    if( Condition ) {
        Case A;
    } else {
        Case B;
    }


After
    
    Case B;
    if( Condition ) {
        Undo Case B;
        Case A;
    }

7. Use finite differences to avoid multiplies

ถ้าเป็นไปได้ลดการใช้ การคูณ จะเพิ่มประสิทธิภาพโปรแกรมขึ้นอีกนิดนึง

Before
 
    for(i=0;i<10;i++) {
        printf("%d\n",i*10);
    }

After
 
    for(i=0;i<100;i+=10) {
        printf("%d\n",i);
    }

8. Use powers of two for multidimensional arrays

พยายามใช้เลขที่เป็นสองยกกำลัง ในการกำหนดจองพื้นที่ Memory

Before

char playfield[80][25];

After

char playfield[80][32];


Information Credit :

Popular posts from this blog

"yes" "yeah" "yep" เหมือนและต่างกันอย่างไร ?

แปลง Word to PDF เนียนขั้นเทพ บรรทัดตรงแป๊ะอย่างกะจับวาง

วิธีตั้งค่า JOOX Music ให้เก็บเพลงแบบ Offline ไว้ที่ SD Card