วันศุกร์ที่ 1 พฤษภาคม พ.ศ. 2558

มาหัดใช้ Linq กันเถอะ

     วันนี้ผมมี เทคนิคการเขียนโปรแกรมภาษา C# มานำเสนอนั้นก็คือ Linq นั้นเอง แต่ก่อนจะเจาะลึกถึงเนื้อหาเรามารู้จักกันก่อนว่า Linq นั้นคืออะไร
     Linq คือ Syntax ที่พัฒนาโดยบริษัท Microsoft เพื่อตอบโจทย์ในการแปลงผลลัพธ์ของการ Query จากฐานข้อมูลมาอยู่ในรูปแบบ Object ได้ง่ายและสะดวกยิ่งขึ้น อีกทั้งรูปแบบ Syntax แทบจะเหมือนกับ SQL ทำให้เราสามารถค้นหาหรือจัดเรียงข้อมูลได้โดยการเขียนโค้ดเพียงไม่กี่บรรทัดเท่านั้น และในด้านการทำงานอาจเร็วและสะดวกกว่าการหาหรือจัดเรียงข้อมูลด้วย for หรือ foreach ได้อีกด้วย หากท่านใดอยากทราบข้อมูลทฤษฎีแบบเจาะลึกให้อ่านข้อมูลที่นี้ดูนะครับ

https://bithai.wordpress.com/2009/09/22/ทำความรู้จัก-linq-ตอน1/
https://bithai.wordpress.com/2009/09/22/ทำความรู้จัก-linq-ตอน2/

    ในส่วนของผมจะเจาะประเด็นไป Linq To Object เป็นหลัก เนื่องจากเป็นส่วนที่ใกล้ตัวมากที่สุดและน่าจะใช้งานบ่อยสุด โดยตัวอย่างโจทย์ที่ผมใช้มาทดสอบคือ

เรียงผลลัพธ์ข้อมูลใน int[] จากน้อยไปหามาก
โดยที่ รูปแบบ input เป็น
1000 , 9, 0, 5, 3, 7, 2, 1, 4 , 11 , 10 , 15 ,8 , 13 , 101 , 99 , 55 , 44 , 21 , 29 , 23 , 159 , 112 , 224
กรณีเปรียบเทียบคือ
   1. อัลกอริทึม Bubble Sort 
   2. อัลกอริทึม Binary Tree
   3. Linq
ซึ่งโค้ดที่ใช้ทดสอบมีลักษณะดังนี้ (ท่านสามารถนำโค้ดชุดนี้ไปรันได้บน Visual Studio)

สเป็คเครื่อง PC ที่ใช้ทดสอบคือ
Intel Core i5-2500K CPU 3.30 GHz
RAM 8 GB

ผลการทดสอบที่ได้คือ

  1. Bubble Sort ใช้เวลาประมาณ 0.1744 ms
  2. Binary Tree Sort (นับเฉพาะเวลา Traverse Node) ใช้เวลาประมาณ 0.2254 ms 
  3. Linq เรียกโค้ดให้ทำงานครั้งที่ 1 ใช้เวลาประมาณ 4.6618 ms 
  4. Linq เรียกโค้ดให้ทำงานครั้งที่ 2 ใช้เวลาประมาณ 0.0176 ms

สรุปผลการทดสอบ
    ในการทำงานของ Linq ครั้งแรก จะทำงานได้ช้ากว่า Bubble Sort หรือ Binary Tree Sort มาก เนื่องจากในการเรียกใช้งานครั้งแรก Syntax จำเป็นจะต้องถูกคอมไพล์ก่อน (Runtime Compile) แต่ถ้าหากเทียบกันกับการเรียกครั้งที่ 2 เราจะเห็นได้ว่า มันทำงานได้เร็วกว่า Bubble Sort กับ Tree Sort เกือบ 10 เท่า ในการเขียนโค้ดจะเห็นได้ว่า LinqOrderByAsc() จะมีจำนวนบรรทัดโค้ดสั้นที่สุดเมื่อเทียบกับ Bubble Sort หรือ Binary Tree Sort ก็ตาม

   หลังจากที่ผมได้ทราบผลการทดสอบ ผมก็ได้ทำการค้นคว้าข้อมูลต่อจนทราบวิธีแก้ไขความล่าช้าในการทำงานครั้งแรก มีอยู่ 2 วิธีที่ทราบคือ
   1. สั่งเรียกชุดคำสั่ง Linq ก่อนใช้งานจริงอย่างน้อย 1 ครั้ง
   2. นำคราส CompiledQuery  (มีในเฉพาะ .NET Framework 4.5 and 4.6 เท่านั้น) มาครอบชุดคำสั่ง Linq ซึ่งวิธีการเขียนโค้ดจะอยู่ใน 
http://www.codeproject.com/Articles/38174/How-to-improve-your-LINQ-query-performance-by-X

แล้ว Unity Engine ละใช้งานได้ไหม?
    ในส่วนของ System.Linq ใช้งานได้บน PC, Android  แต่จะมีปัญหากับการคอมไพล์บน iOS เช่น กรณีที่มีการใช้งาน OrderBy เป็นต้น  การแก้ไขเบื้องต้น คือ ติดตั้ง Asset : Linq To iOS (เสียเงิน) หรือ UniLinq (ฟรี) ก็จะทำให้โค้ดที่เราเขียนสามารถทำงานได้บน iOS ตามปกติครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น