Nine MVP's Blog

27/03/2006

Tip&Trick เพิ่มประสิทธิภาพการทำงานของ Windows Forms Apps ของคุณ

Filed under: Computers and Internet — Nine MVP @ 5:42 pm
สืบเนื่องจากว่า ภาษาอังกฤษของบางคนไม่ค่อยแข็งแรงเท่าไหร่
เลยปล่อยปะละเลยบทความดี ๆ ที่ MS ได้ตีพิมพ์ให้เหล่าโปรแกรมเมอร์ได้ไปอ่านเพิ่มเติมความรู้กัน
นั้นก็คือ MSDN, MSDN Magazine

ผมจึงหยิบบทความเรื่อง Practical Tips For Boosting The Performance Of Windows Forms Apps
ที่อยู่ใน MSND Magazine เดือน March 2006 มาทดลองดูว่าจริงหรือไม่อย่างไร

ก่อนอื่นหลายคนเคยใช้ การ Binding DataSource ต่าง ๆ ไม่ว่าจะเป็น DataSet, ArrayList, Array เข้าไปใน Windows Control

ตัวอย่าง เช่น  Binding DataSet ให้ ComboBox ตัว code ที่เราใช้กันจนแพร่หลายก็คือ  

combobox1.DataSoruce = dataset1.tables["test"];
combobox1.ValueMember = "col1";
combobox1.DisplayMember = "col2";

ซึ่งวิธีนี้ผมเองก็ใช้อยุ่ประจำ แต่ก็รู้สึกได้ว่าdelayค่อนข้างมาก
หากมี combobox ที่ต้อง binding ขณะที่ form_load เป็นจำนวนมาก ๆ ใน Form นั้น

จนได้มาอ่านบทความนี้ของ MS ก็ได้สงสัยว่ามันจะจริงเหรอ ที่ว่าเร็วกว่ามาก ด้วย code ข้างล่างนี้

combobox1.ValueMember = "col1";
combobox1.DisplayMember = "col2";

combobox1.DataSoruce = dataset1.tables["test"];

ผมจึงทดลองด้วยการจับเวลาของการทำงาน ในแต่ละ logic ว่าแบบไหนทำงานได้รวดเร็วกว่ากัน
โดยจะไป get ค่าเวลามาจาก CPU โดยตรง (class ที่ใช้จับเวลา http://www.greatfriends.biz?13622 )

Code Test

// ขณะที่ Form1_Load() ทำงาน

//เอาไว้จับเวลา

HiPerfTimer pf = new HiPerfTimer();


string
constr = "Data Source=(local);Initial Catalog=Northwind;User ID=sa;password=;";

string sql = "select CustomerID, CompanyName from Customers";


DataSet
ds = new DataSet();


//ใช้ข้อมุลจาก Northwind

SqlDataAdapter da = new SqlDataAdapter(sql , new SqlConnection(constr));

da.Fill(ds,

"test");


//จับเวลา การ binding แบบที่เรานิยมใช้กัน

pf.Start();

comboBox1.DataSource = ds.Tables[0];

comboBox1.ValueMember = "CustomerID";

comboBox1.DisplayMember = "CompanyName";

pf.Stop();

label3.Text = pf.Duration.ToString();


//จับเวลา การ binding แบบที่ MS เขาแนะนำมา

pf.Start();

comboBox2.ValueMember =

"CustomerID";

comboBox2.DisplayMember =

"CompanyName";

comboBox2.DataSource = ds.Tables[0];

pf.Stop();

label4.Text = pf.Duration.ToString();


//หาผลต่างของเวลา ทั้ง 2 วิธี

label5.Text = Convert.ToString(Convert.ToDouble(label3.Text) – Convert.ToDouble(label4.Text));

ภาพผลลัพธ์

จะเห็นได้ว่า
Code ที่เราใช้กันประจำ ทำเวลาได้ 0.173930764943589
Code ที่ MS แนะนำ     ทำเวลาได้ 0.0376771349431283
logic ที่เราใช้กันประจำช้ากว่าถึง    0.136253630000461    

ทำไมถึงช้ากว่า 5.6 เท่า น่าสงสัยทีเดียว

ผมอธิบายง่าย ๆ ว่ามีการ Binding DataSource ซ้ำซ้อนเกิดขึ้น ใน Code ที่เราใช้กันเป็นประจำ ทั้ง 3 บรรทัด
แต่ code ของ MS มีการ Bind เกิดขึ้นเพียงครั้งเดียวคือ บรรทัดสุดท้าย

จากบทความนี้ของ MS ช่วยให้เรา ได้คิดกันว่า control ที่เรากำลังใช้ ๆ กันอยู่
มันทำงานข้างในเป็นอย่างไรนั้น หากไม่ศึกษาให้ละเอียดก่อนจะนำมาใช้งาน ก็อาจจะไม่ได้วิธีการทำงานที่ดีที่สุด
ซึ่งก็อาจจะเป็นการเพิ่ม Cost ขึ้นมาโดยไม่รู้ตัวก็เป็นได้

ยังมีอีกหลาย ๆ วิธีครับ ที่จะช่วยให้การทำงานของโปรแกรมของคุณนั้นทำงานได้รวดเร็วขึ้น
ยังงัยก็ลองไปหา download อ่านกันได้ที่นี่ครับ
http://msdn.microsoft.com/msdnmag/htmlhelp.aspx

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

Create a free website or blog at WordPress.com.