[Dev] ใช้คำสั่ง Loop กับการเขียน Recursive บน Android แบบไหนดีกว่ากันนะ

จากบทความที่แล้ว เราได้ทดสอบคำสั่ง Loop ในรูปแบบต่าง ๆ กันมาแล้ว ทีนี้เรามาลองทดสอบกันซะหน่อย ว่าถ้าไม่ใช้ Loop แต่ใช้ Recursive Function ทำงานแทน จะทำงานได้เร็วหรือช้ากว่ากัน

Android-Developer-logo_Benchmark-Loop-vs-Recursive

ในการทดสอบครั้งนี้ จะใช้โจทย์เดียวกับบทความที่แล้ว ก็คือ การบวกเลขตั้งแต่ 0 ไปจนถึง n-1 ซึ่ง n ก็คือตัวเลขที่เราจะสุ่มขึ้นมา ซึ่งมีค่าอยู่ในช่วง 1-100 นั่นเอง

โดยผมจะเลือกใช้ Loop ชนิด Do-While ที่ให้ผลการทำงานที่เร็วที่สุดจากการทดสอบที่แล้ว มาทดสอบเทียบกับ Recursive Function ไปดู Code กันเลยยยยย

 

Do-While Loop

สำหรับ Loop Do-While ก็เป็น Code เดิมจากบทความที่แล้วนั่นเอง

 

Recursive Function

สำหรับ Recursive Function ก็คือ Function ที่มีการเรียกใช้งาน Function ตัวเองซ้อน ๆ เข้าไปเรื่อย ๆ สำหรับโจทย์นี้ สามารถเขียนออกมาได้เป็นดังนี้

 

Benchmark

สำหรับการวัดผล จะใช้ Loop ครอบคำสั่งเช่นเดิม ดังนี้

ทดสอบด้วย Input 10,000,000 ตัว บน Nexus S Android 4.1.1 กับ Nexus 4 Android 5.0 ใน Genymotion เช่นเดิม ได้ผลออกมาดังนี้

ผลการ Benchmark Loop เทียบกับ Recursive บน Nexus S Android 4.1.1
ผลการ Benchmark Loop เทียบกับ Recursive บน Nexus S Android 4.1.1
ผลการ Benchmark Loop เทียบกับ Recursive บน Nexus 4 Android 5.0
ผลการ Benchmark Loop เทียบกับ Recursive บน Nexus 4 Android 5.0

ผลออกมา ชัดเจนมาก ๆ ว่า Loop ทำงานได้เร็วกว่า Recursive Function ประมาณ 4 เท่าตัว!!

 

สำหรับผลการทดสอบจากทางบ้าน ผมจะอัพเดตไว้ตรงนี้นะครับ ขอบคุณที่ร่วมทดสอบครับ

 

สำหรับการ Benchmark ครั้งนี้ ค่อนข้างชัดเจนนะครับ สรุปว่า…

Loop ทำงานได้เร็วกว่า Recursive Function มาก

 

สำหรับใครสนใจอยากดู Code เต็ม ๆ ไปดูได้ที่ GitHub นะครับ หรืออยาก Benchmark คำสั่งอื่น ๆ ก็ Fork ไปทำได้เลยนะ อย่าลืม Pull Request มาด้วยนะครับ จะได้เอามารวบรวมไว้ที่เดียวกัน

ส่วนใครอยากลองรันโปรแกรมดูบ้าง สามารถ Download apk ไปรันดูได้ครับ แล้วอย่าลืมรายงานผลบ้างนะ…

2 Comments


  1. การวัดประสิทธิภาพด้วย System.currentTimeMillis(); ถือว่าเป็นการเลือกใช้เครื่องมือที่ไม่ถูกต้องเท่าไหร่ครับ ที่ถูกต้องควรจะใช้ System.nanoTime(); ครับ อย่างไรก็ดีขอบคุณที่นำเสนอข้อมูลครับ

    Reply

    1. ขอบคุณสำหรับข้อมูลครับ

      เดี๋ยวไว้ผมจะนำไปอัพเดต Code และบทความใหม่ครับ

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.