การปรับปรุงประสิทธิภาพ

MicroPython ใช้การปรับปรุงประสิทธิภาพหลายอย่างเพื่อประหยัด RAM แต่ยังเพื่อให้แน่ใจว่าโปรแกรมทำงานได้อย่างมีประสิทธิภาพ บทนี้กล่าวถึงการปรับปรุงประสิทธิภาพบางส่วน

Note

การ interning สตริงใน MicroPython และ Maps และ Dictionaries อธิบายการปรับปรุงประสิทธิภาพอื่น ๆ สำหรับสตริงและพจนานุกรม

Frozen bytecode

เมื่อ MicroPython โหลดโค้ด Python จากระบบไฟล์ ขั้นแรกต้องแยกวิเคราะห์ไฟล์เป็นการแสดงแทนชั่วคราวในหน่วยความจำ จากนั้นสร้าง bytecode เพื่อประมวลผล ทั้งสองอย่างนี้ถูกเก็บไว้ใน heap (ใน RAM) ซึ่งอาจทำให้ใช้หน่วยความจำจำนวนมาก คอมไพเลอร์ข้ามของ MicroPython สามารถใช้สร้างไฟล์ .mpy ที่มี bytecode ที่คอมไพล์ไว้ล่วงหน้าสำหรับโมดูล Python ซึ่งจะยังโหลดลง RAM แต่หลีกเลี่ยงค่าใช้จ่ายเพิ่มเติมของขั้นตอนการแยกวิเคราะห์

เพื่อการปรับปรุงเพิ่มเติม bytecode ที่คอมไพล์ไว้ล่วงหน้าจากไฟล์ .mpy สามารถ "freeze" ลงในอิมเมจเฟิร์มแวร์เป็นส่วนหนึ่งของกระบวนการคอมไพล์เฟิร์มแวร์หลัก ซึ่งหมายความว่า bytecode จะถูกประมวลผลจาก ROM วิธีนี้สามารถประหยัดหน่วยความจำได้อย่างมีนัยสำคัญ และลดการแตกกระจายของ heap

ดูที่ ไฟล์แมนิเฟสต์ของ MicroPython สำหรับข้อมูลเพิ่มเติม

ตัวแปร

MicroPython ประมวลผลตัวแปรท้องถิ่นและตัวแปรส่วนกลางแตกต่างกัน ตัวแปรส่วนกลางถูกเก็บและค้นหาจากพจนานุกรมส่วนกลางที่จัดสรรบน heap (โปรดทราบว่าแต่ละโมดูลมี dict แยกต่างหาก ดังนั้นจึงมี namespace แยกกัน) ในขณะที่ตัวแปรท้องถิ่นถูกเก็บบน Python value stack ซึ่งอาจอยู่บน C stack หรือบน heap ตัวแปรเหล่านี้เข้าถึงได้โดยตรงจาก offset ภายใน Python stack ซึ่งมีประสิทธิภาพมากกว่าการค้นหาแบบ global ใน dict

ความยาวของชื่อตัวแปรส่วนกลางยังส่งผลต่อปริมาณ RAM ที่ใช้ด้วย เนื่องจาก identifier ถูกเก็บไว้ใน RAM identifier ที่สั้นกว่าจะใช้หน่วยความจำน้อยกว่า

อีกแง่มุมหนึ่งคือตัวแปร const ที่ขึ้นต้นด้วยเครื่องหมายขีดล่างจะถูกถือว่าเป็นค่าคงที่จริง ๆ และไม่ได้รับการจัดสรรหรือเพิ่มลงในพจนานุกรม จึงประหยัดหน่วยความจำบางส่วน ตัวแปรเหล่านี้ใช้ const() จากไลบรารี MicroPython ดังนั้น:

from micropython import const

X = const(1)
_Y = const(2)
foo(X, _Y)

คอมไพล์เป็น:

X = 1
foo(1, 2)

การจัดสรรหน่วยความจำ

โครงสร้าง MicroPython ทั่วไปส่วนใหญ่ไม่ได้รับการจัดสรรบน heap อย่างไรก็ตาม สิ่งต่อไปนี้จะถูกจัดสรรบน heap:

  • โครงสร้างข้อมูลแบบไดนามิก เช่น lists, mappings เป็นต้น

  • ฟังก์ชัน คลาส และ object instances

  • การนำเข้า; และ

  • การกำหนดค่าครั้งแรกของตัวแปรส่วนกลาง (เพื่อสร้าง slot ใน global dict)

สำหรับการอภิปรายโดยละเอียดในมุมมองที่เน้นผู้ใช้มากขึ้นเกี่ยวกับการปรับปรุงประสิทธิภาพ ดูที่ Maximising MicroPython speed