เลยปล่อยปะละเลยบทความดี ๆ ที่ 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 sql = "select CustomerID, CompanyName from Customers";
SqlDataAdapter da = new SqlDataAdapter(sql , new SqlConnection(constr)); da.Fill(ds, "test");
pf.Start(); comboBox1.DataSource = ds.Tables[0]; comboBox1.ValueMember = "CustomerID"; comboBox1.DisplayMember = "CompanyName"; pf.Stop(); label3.Text = pf.Duration.ToString();
pf.Start(); comboBox2.ValueMember = "CustomerID"; comboBox2.DisplayMember = "CompanyName"; comboBox2.DataSource = ds.Tables[0]; pf.Stop(); label4.Text = pf.Duration.ToString();
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