Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

เรียนรู้การปรับปรุงประสิทธิภาพ Android App ของ SlideShare กัน

$
0
0

android-icon

Screen Shot 2558-11-16 at 9.47.23 AM จากบทความเรื่อง Android Performance Improvement for SlideShare ทำการอธิบาย วิธีการปรับปรุงประสิทธิภาพการทำงานของ SlideShare App บน Android มีเป้าหมายเพื่อ
  • ให้ app มีประสิทธิภาพที่ดีขึ้น
  • ให้ผู้ใช้งาน app สามารถใช้งานได้ราบรื่นขึ้น
  • ลดจำนวนการ crash ของ app ลง
มาดูว่าทีมพัฒนา SlideShare app เขาทำกันอย่างไรบ้าง ?

มี 3 เรื่องที่ทีมพัฒนาเน้นสำหรับการปรับปรุง app

ประกอบไปด้วย
  1. Image loading
  2. JSON parsing
  3. Data model storage
มาดูรายละเอียดของแต่ละเรื่องกัน

1. เรื่องการ load ภาพ (Image loading)

ทีมพัฒนาใช้งาน opensource library ในการ load ภาพ ไม่ว่าจะเป็น Picasso และ Glide โดย library ต่าง ๆ เหล่านี้ล้วนมีปัญหาเรื่อง memory ทั้งนั้น เนื่องจากข้อมูลรูปภาพจะถูกจัดเก็บใน memory ถึงแม้ว่าอาจจะไม่ทำให้ app หยุดทำงาน แต่ก็ทำให้การใช้งาน app ไม่ราบรื่น และกระตุกในตอนที่ต้องเลื่อนหน้าไปมา ปัญหามันเกิดจากรูปภาพมีขนาดใหญ่นั่นเอง ส่งผลให้ตัว Garbage Collector มันหยุดทำงาน ดังนั้น ทีมพัฒนาจึงต้องทำการ optimize การ load รูปภาพโดยด่วน เพื่อให้ใช้ memory น้อยลง จะได้ลดปัญหาต่าง ๆ ลงไป สิ่งที่ทีมพัฒนาได้สร้างขึ้นมา คือ library ของตัวเอง เพื่อจัดการการ load รูปภาพโดยเฉพาะ ซึ่งมีความสามารถในเรื่อง bitmap pooling และ การ recycle bitmap โดยการทำงานจะต้องขึ้นอยู่กับเวอร์ชันของ Android อีกด้วย (ยากมากมาย) !! ประกอบไปด้วย ก่อน Android Lollipop Bitmap จะถูก decode ด้วย inPurgeable flag ทำการจัดเก็บ bitmap ที่จะ load และ cahing ไว้ใน ashmem ซึ่งแน่นอนว่า ไม่ได้อยู่ใน Java HEAP ดังนั้นทำให้มั่นใจได้ว่าตัว Garbage Collector จะไม่มีทางหยุดทำงานอย่างแน่นอน แสดงการทำงานดังรูป pre_lollipop_image_flow ตั้งแต่ Lollipop เป็นต้นไป จะทำการเก็บ bitmap ไว้ให้อยู่แล้ว และไม่สามารถใช้ inPurgeable flag ได้แล้วเนื่องจากมัน deprecated ไปแล้ว ส่วนการ reuse bitmap จะใช้งานผ่าน inBitmap รวมทั้งตัว Garbage Collector มันทำงานแบบ background process ใน ART ซึ่งหมายความว่า ข้อมูล bitmap จะไม่อยู่ใน JAVA HEAP ซึ่งหมายความว่าปัญหาต่าง ๆ จะหมดไป แสดงการทำงานดังรูป lollipop_image_flow สามารถดูเพิ่มเติมได้ที่ Android Developer :: Managing Bitmap Memory

2. การ parser ข้อมูลในรูปแบบ JSON (JSON parsing)

รูปแบบข้อมูลในการติดต่อสื่อสารระหว่าง app กับ server side คือ JSON ดังนั้น
  • ใน Android app ต้องแปลงข้อมูลจาก JSON มายัง data model เพื่อใช้งาน
  • ใน Android app ต้องแปลงช้อมูลจาก data model ไปยัง JSON ก่อนที่จัดส่งไปยัง server side
ซึ่งการแปลงข้อมูลไปมาเช่นนี้ คือการใช้ resource ของ device นั่นเอง (Resource driven) คำถาม คือ แล้วจะใช้ library จัดการข้อมูล JSON ตัวไหนดีล่ะ ? คำตอบ JSON parser ที่มีมาให้ใน Android SDK ทำงานได้ช้า แถมใช้ memory เยอะอีก แถมไม่มี stream parsing อีก ( ก่อน Honeycomb ) ดังนั้นตัดตัวนี้ไปได้เลย ทางทีมพัฒนาได้ลองใช้ library หลาย ๆ ตัว ไม่ว่าจะเป็น Jackson, JSON, LoganSquare
สุดท้ายพบว่า LoganSquare ตรงกับความต้องการ และมีประสิทธิภาพในการทำงานดีที่สุด

3. การจัดเก็บข้อมูล data model ( Data model storage )

โดยปกติข้อมูลที่ใช้บน Android app จะต้องมีการเก็บ caching data ไว้ใช้เสมอ เพื่อประสิทธิภาพการทำงานของ app ที่ดี การทำงานประกอบไปด้วย
  • การจัดเก็บข้อมูล
  • การอ่านข้อมูล
ดังนั้น เราต้องการที่จัดเก็บข้อมูล หรือ database บน Android ที่มีความเร็วในการอ่าน และ เขียน สูง ๆ โดยทีมพัฒนาเริ่มใช้งาน SQLite ก่อน แต่เมื่อมีการอ่าน และ เขียนในปริมาณที่สูง ๆ รวมทั้งจำนวนข้อมูลที่มาก และ ซับซ้อนขึ้นเรื่อย ๆ พบว่า มันได้กลายเป็นปัญหาคอขวดของ app ไป ดังนั้น ทีมพัฒนาจึงได้นำ key-value data มาใช้ นั่นก็คือ SnappyDB เริ่มจากการนำมาใช้แทนที่ SharedPreference ก่อน เพราะว่า SharedPreference จะมีปัญหาเมื่อจำนวน key มันมีปริมาณมาก ๆ ตอนนี้ยังไม่ได้นำมาใช้แทนที่ SQLite นะ แต่ในอนาคตทีมพัฒนากำลังทำอยู่ และ อยู่ในแผนอีกด้วย

จากการแก้ไขปัญหา 3 เรื่องนี้ ทีมพัฒนาก็ได้ทำ benchmark ซึ่งได้ผลดังนี้

  • จำนวน memory ที่ถูกใช้งานลดลงไป 47% โดยจำนวน memory สูงสุดใช้ไปเพียง 40% เท่านั้น
  • ปัญหาเรื่องตัว Garbage Collector หยุดทำงาน ลดลงไป 92%
  • เมื่อนำ LoganSquare มาใช้สำหรับการ parsing JSON พบว่าทำงานเร็วขึ้น 15%
แต่ก็ยังมีปัญหาอื่น ๆ ให้แก้ไข และ ปรับปรุงต่อไป โดยสิ่งที่ต้องการ และ เป็นเป้าหมายหลักของทีมพัฒนา คือ Android app crash-free for 99.9 %
นี่คือวิธีการปรับปรุงประสิทธิภาพ Android app ของ Slideshare นะ น่าจะมีประโยชน์สำหรับ Android developer กันบ้าง ลองนำไปศึกษา และ ใช้งานกันดูครับ

Viewing all articles
Browse latest Browse all 1997

Trending Articles