توسعة لوحدة ذاكـرة
ضمن مـتم
.
اشمل "مـحا"؛
مـحا.اشمل_ملف("Alusus/ExtendedMemory"، "تـوسعة_ذاكرة.أسس")؛
import "Apm";
Apm.importFile("Alusus/ExtendedMemory");
اشمل "مـتم/طـرفية"؛
اشمل "مـتم/ذاكـرة"؛
اشمل "مـحا"؛
مـحا.اشمل_ملف("Alusus/ExtendedMemory"، "توسيع_ذاكرة.أسس")؛
استخدم مـتم؛
// نفذ برنامجا مع ججز مسبق للذاكرة لتجنب ضريبة الأداء الناتجة عن الحجز المتكرر للذاكرة.
ذاكـرة.نفذ_مع_حجز_مسبق(4 * 1024 * 1024 /* 4 ميجابايت */، 4 * 1024 * 1024، 0، مغلفة () {
// متن البرنامج هنا.
...
})؛
import "Srl/Console";
import "Srl/Memory";
import "Apm";
Apm.importFile("Alusus/ExtendedMemory");
use Srl;
// Execute a program with pre-allocated memory block to avoid the overhead of repetitive
// memory allocations.
Memory.runWithPreallocation(4 * 1024 * 1024 /* 4 MB */, 4 * 1024 * 1024, false, closure() {
// Program body here.
...
});
دالة ابدأ_الحجز_المسبق(الحجم: صـحيح_متكيف، مقدار_الزيادة: صـحيح_متكيف): مؤشر؛
func startPreallocation(size: ArchInt, enlargementSize: ArchInt): ptr;
هذه الدالة تحجز مساحة من الذاكرة مسبقًا لتُستخدم لتسريع عمليات حجز الذاكرة اللاحقة. بعد استدعاء
هذه الدالة كل عملية ذاكـرة.احجز
(Memory.alloc
) ستحصل على مساحة ضمن هذه المساحة المحجوزة مسبقًا،
وكل استدعاء لدالة ذاكـرة.حرر
(Memory.free
) لا يؤدي لأي تحرير للذاكرة، بدلًا من ذلك تُحرر كل الذاكرة
مرة واحدة عند استدعاء دالة أنه_الحجز_المسبق
(endPreallocation
).
يجب الانتباه عند استخدام هذه الدالة أن أي عملية حجز تتم بعد استدعاء هذه الدالة ستُحرر تلقائيًا عند
استدعاء أنه_الحجز_المسبق
حتى لو لم تُستدعَ دالة حرر
لتلك المساحة، لأن المساحة المحجوزة بدالة
ابدأ_الحجز_المسبق
تُحرر مرة واحدة، وهو ما يؤدي إلى تسريع الأداء. هذا يعني أن على المستخدم أن يكون
حذرًا ويتجنب أي حجز لذاكرة ينوي استخدامها بعد استدعاء أنه_الحجز_المسبق
.
كل استدعاء لهذه الدالة يجب أن يرافقه استدعاء لدالة أنه_الحجز_المسبق
(endPreallocation
). يمكن
استدعاء هذه الدالة بشكل متداخل، أي استدعاء ابدأ_الحجز_المسبق
مجددًا قبل استدعاء أنه_الحجز_المسبق
.
المعطيات:
- الحجم (size): حجم مساحة الذاكرة التي ستُحجز ابتداءًا.
- مقدار_الزيادة (enlargementSize): حجم المساحة الإضافية التي ستُحجز أثناء استدعاء
ذاكـرة.احجز
كلما نفدت المساحة الحالية.
القيمة المرجعة: ترجع الدالة مؤشرًا بمثابة معرف لتمريره لاحقًا إلى دالة أنه_الحجز_المسبق
.
دالة أنه_الحجز_المسبق(الكتلة: مؤشر)؛
دالة أنه_الحجز_المسبق(الكتلة: مؤشر, طباعة_ملاحظات: ثـنائي)؛
func endPreallocation(block: ptr);
func endPreallocation(block: ptr, printLog: Bool);
تنهي الحجز المسبق للاستدعاء المحدد لدالة ابدأ_الحجز_المسبق
وتحرر كل الذاكرة التي حجزت ابتداءًا
من ذلك الاستدعاء.
المعطيات:
- الكتلة (block): المعرف المستلم من دالة
ابدأ_الحجز_المسبق
. - طباعة_ملاحظات (printLog): في حالة تمرير قيمة 1 إلى هذه الدالة تطبع الدالة ملاحظات حول عمليات الحجز التي تمت
منذ آخر استدعاء لدالة
ابدأ_حجز_الذاكرة
. تفيد هذه المعلومات في معرفة ما إن كان في البرنامج تسريب في الذاكرة.
دالة نفذ_مع_حجز_مسبق(
الحجم: صـحيح_متكيف، مقدار_الزيادة: صـحيح_متكيف، طباعة_ملاحظات: ثـنائي، ما_سينفذ: مغلفة()
)؛
func runWithPreallocation(
size: ArchInt, enlargementSize: ArchInt, printLog: Bool, toRun: closure()
);
هذه الدالة مجرد دالة مساعدة تستدعي تنفذ المغلفة المعطاة ضمن عملية حجز مسبق. راجع دالتي
ابدأ_الحجز_المسبق
و أنه_الحجز_المسبق
لمعلومات حول معطيات هذه الدالة.