จากบทความเรื่อง Android Performance Improvement for SlideShare
ทำการอธิบาย วิธีการปรับปรุงประสิทธิภาพการทำงานของ SlideShare App บน Android
มีเป้าหมายเพื่อ
- ให้ app มีประสิทธิภาพที่ดีขึ้น
- ให้ผู้ใช้งาน app สามารถใช้งานได้ราบรื่นขึ้น
- ลดจำนวนการ crash ของ app ลง
มี 3 เรื่องที่ทีมพัฒนาเน้นสำหรับการปรับปรุง app
ประกอบไปด้วย- Image loading
- JSON parsing
- 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 จะไม่มีทางหยุดทำงานอย่างแน่นอน แสดงการทำงานดังรูป ตั้งแต่ Lollipop เป็นต้นไป จะทำการเก็บ bitmap ไว้ให้อยู่แล้ว และไม่สามารถใช้ inPurgeable flag ได้แล้วเนื่องจากมัน deprecated ไปแล้ว ส่วนการ reuse bitmap จะใช้งานผ่าน inBitmap รวมทั้งตัว Garbage Collector มันทำงานแบบ background process ใน ART ซึ่งหมายความว่า ข้อมูล bitmap จะไม่อยู่ใน JAVA HEAP ซึ่งหมายความว่าปัญหาต่าง ๆ จะหมดไป แสดงการทำงานดังรูป สามารถดูเพิ่มเติมได้ที่ Android Developer :: Managing Bitmap Memory2. การ parser ข้อมูลในรูปแบบ JSON (JSON parsing)
รูปแบบข้อมูลในการติดต่อสื่อสารระหว่าง app กับ server side คือ JSON ดังนั้น- ใน Android app ต้องแปลงข้อมูลจาก JSON มายัง data model เพื่อใช้งาน
- ใน Android app ต้องแปลงช้อมูลจาก data model ไปยัง JSON ก่อนที่จัดส่งไปยัง server side
สุดท้ายพบว่า LoganSquare ตรงกับความต้องการ และมีประสิทธิภาพในการทำงานดีที่สุด
3. การจัดเก็บข้อมูล data model ( Data model storage )
โดยปกติข้อมูลที่ใช้บน Android app จะต้องมีการเก็บ caching data ไว้ใช้เสมอ เพื่อประสิทธิภาพการทำงานของ app ที่ดี การทำงานประกอบไปด้วย- การจัดเก็บข้อมูล
- การอ่านข้อมูล
จากการแก้ไขปัญหา 3 เรื่องนี้ ทีมพัฒนาก็ได้ทำ benchmark ซึ่งได้ผลดังนี้
- จำนวน memory ที่ถูกใช้งานลดลงไป 47% โดยจำนวน memory สูงสุดใช้ไปเพียง 40% เท่านั้น
- ปัญหาเรื่องตัว Garbage Collector หยุดทำงาน ลดลงไป 92%
- เมื่อนำ LoganSquare มาใช้สำหรับการ parsing JSON พบว่าทำงานเร็วขึ้น 15%
นี่คือวิธีการปรับปรุงประสิทธิภาพ Android app ของ Slideshare นะ น่าจะมีประโยชน์สำหรับ Android developer กันบ้าง ลองนำไปศึกษา และ ใช้งานกันดูครับ