การปรับปรุงประสิทธิภาพ¶
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