"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > تحسين الأداء من خلال التحليل الثابت وتهيئة الصور والتقاط الصور المجمعة

تحسين الأداء من خلال التحليل الثابت وتهيئة الصور والتقاط الصور المجمعة

تم النشر بتاريخ 2024-11-08
تصفح:377

من الهياكل المتجانسة إلى عالم الأنظمة الموزعة، قطع تطوير التطبيقات شوطا طويلا. لقد أدى الاعتماد الهائل للحوسبة السحابية وهندسة الخدمات الصغيرة إلى تغيير كبير في النهج المتبع في كيفية إنشاء تطبيقات الخادم ونشرها. بدلاً من خوادم التطبيقات العملاقة، أصبح لدينا الآن خدمات مستقلة منتشرة بشكل فردي والتي تدخل حيز التنفيذ
عند الحاجة.

ومع ذلك، قد يكون اللاعب الجديد في الكتلة الذي يمكن أن يؤثر على هذا الأداء السلس هو "البدء البارد". تبدأ البداية الباردة عندما تتم معالجة الطلب الأول على عامل حديث الولادة. يتطلب هذا الموقف تهيئة وقت تشغيل اللغة وتهيئة تكوين الخدمة قبل معالجة الطلب الفعلي. يمكن أن يؤدي عدم القدرة على التنبؤ والتنفيذ البطيء المرتبط بالبدء البارد إلى انتهاك اتفاقيات مستوى الخدمة الخاصة بالخدمة السحابية. إذًا، كيف يمكن مواجهة هذا القلق المتزايد؟

الصورة الأصلية: تحسين وقت بدء التشغيل وبصمة الذاكرة

لمكافحة أوجه القصور في البداية الباردة، تم تطوير نهج جديد يتضمن تحليل النقاط، وتهيئة التطبيق في وقت الإنشاء، والتقاط لقطات الكومة، وتجميع (AOT) المسبق. تعمل هذه الطريقة وفقًا لافتراض العالم المغلق، حيث تتطلب أن تكون جميع فئات Java محددة مسبقًا ويمكن الوصول إليها في وقت الإنشاء. خلال هذه المرحلة، يحدد التحليل الشامل للنقاط جميع عناصر البرنامج التي يمكن الوصول إليها (الفئات والأساليب والحقول) لضمان تجميع أساليب Java الأساسية فقط.

يمكن تنفيذ رمز التهيئة للتطبيق أثناء عملية الإنشاء وليس في وقت التشغيل. يسمح هذا بالتخصيص المسبق لكائنات Java وإنشاء هياكل بيانات معقدة، والتي يتم إتاحتها بعد ذلك في وقت التشغيل عبر "كومة الصور". تم دمج كومة الصورة هذه في الملف القابل للتنفيذ، مما يوفر التوفر الفوري عند بدء التطبيق. ال
يستمر التنفيذ التكراري لتحليل النقاط والتقاط الصور حتى يتم الوصول إلى حالة مستقرة (نقطة ثابتة)، مما يؤدي إلى تحسين وقت بدء التشغيل واستهلاك الموارد.

سير العمل التفصيلي

مدخلات نظامنا هي Java bytecode، والتي يمكن أن تنشأ من لغات مثل Java أو Scala أو Kotlin. تتعامل العملية مع التطبيق ومكتباته ومكونات JDK وVM بشكل موحد لإنتاج ملف تنفيذي أصلي خاص بنظام التشغيل والهندسة المعمارية - يُطلق عليه "الصورة الأصلية". تتضمن عملية البناء تحليل النقاط التكرارية ولقطات الكومة حتى يتم الوصول إلى نقطة ثابتة، مما يسمح للتطبيق بالمشاركة بنشاط من خلال عمليات الاسترجاعات المسجلة. تُعرف هذه الخطوات مجتمعة باسم عملية إنشاء الصورة الأصلية (الشكل 1)

Enhancing Performance with Static Analysis, Image Initialization and Heap Snapshotting

الشكل 1 - عملية بناء الصورة الأصلية (المصدر: redhat.com)

نقاط للتحليل

نحن نستخدم تحليل النقاط للتأكد من إمكانية الوصول إلى الفئات والأساليب والحقول أثناء وقت التشغيل. يبدأ تحليل النقاط إلى جميع نقاط الدخول، مثل الطريقة الرئيسية للتطبيق، ويجتاز بشكل متكرر جميع الطرق التي يمكن الوصول إليها بشكل متعدٍ حتى الوصول إلى نقطة ثابتة (الشكل 2).

Enhancing Performance with Static Analysis, Image Initialization and Heap Snapshotting

الشكل 2 - النقاط للتحليل

يعمل تحليل النقاط على الاستفادة من الواجهة الأمامية للمترجم الخاص بنا لتحليل رمز Java الثانوي في التمثيل المتوسط ​​عالي المستوى للمترجم (IR). وبعد ذلك، يتم تحويل IR إلى رسم بياني لتدفق النوع. في هذا الرسم البياني، تمثل العقد تعليمات تعمل على أنواع الكائنات، بينما تشير الحواف إلى حواف الاستخدام الموجه بين العقد، مشيرة من التعريف إلى الاستخدام. تحتفظ كل عقدة بحالة النوع، والتي تتكون من قائمة الأنواع التي يمكنها الوصول إلى معلومات العقدة والصفر. تنتشر حالات الكتابة عبر حواف الاستخدام؛ إذا تغيرت حالة نوع العقدة، فسيتم نشر هذا التغيير على جميع الاستخدامات. الأهم من ذلك، أن حالات الكتابة يمكن أن تتوسع فقط؛ يمكن إضافة أنواع جديدة إلى حالة النوع، ولكن لا تتم إزالة الأنواع الموجودة أبدًا. تضمن هذه الآلية أن
ويتقارب التحليل في النهاية إلى نقطة ثابتة، مما يؤدي إلى الإنهاء.

تشغيل رمز التهيئة

يوجه تحليل النقاط إلى تنفيذ كود التهيئة عندما يصل إلى نقطة ثابتة محلية. تجد هذه التعليمات البرمجية أصولها في مصدرين منفصلين: مُهيئات الفئة ومجموعة التعليمات البرمجية المخصصة التي يتم تنفيذها في وقت الإنشاء من خلال واجهة الميزات:

  1. مُهيئات الفئة: يمكن أن يكون لكل فئة Java مُهيئ فئة يُشار إليه بطريقة ، والتي تقوم بتهيئة الحقول الثابتة. يمكن للمطورين اختيار الفئات التي سيتم تهيئتها في وقت البناء مقابل وقت التشغيل.

  2. عمليات الاسترجاعات الصريحة: يمكن للمطورين تنفيذ تعليمات برمجية مخصصة من خلال الخطافات التي يوفرها نظامنا، وتنفيذها قبل مراحل التحليل أو أثناءها أو بعدها.

إليك واجهات برمجة التطبيقات المتوفرة للتكامل مع نظامنا.

واجهة برمجة التطبيقات السلبية (الاستعلام عن حالة التحليل الحالية)

boolean isReachable(Class> clazz);

boolean isReachable(Field field);

boolean isReachable(Executable method);

لمزيد من المعلومات، راجع QueryReachabilityAccess

واجهة برمجة التطبيقات النشطة (تسجل عمليات الاسترجاعات لتغييرات حالة التحليل):

void registerReachabilityHandler(Consumer callback, Object... elements);

void registerSubtypeReachabilityHandler(BiConsumer> callback, Class> baseClass);

void registerMethodOverrideReachabilityHandler(BiConsumer callback, Executable baseMethod);

لمزيد من المعلومات، راجع قبل الوصول إلى التحليل

خلال هذه المرحلة، يمكن للتطبيق تنفيذ تعليمات برمجية مخصصة مثل تخصيص الكائنات وتهيئة هياكل البيانات الأكبر حجمًا. والأهم من ذلك، أن كود التهيئة يمكنه الوصول إلى حالة تحليل النقاط الحالية، مما يتيح الاستعلامات المتعلقة بإمكانية الوصول إلى الأنواع أو الأساليب أو الحقول. ويتم تحقيق ذلك باستخدام أساليب isReachable() المتنوعة التي توفرها أثناء تحليل الوصول. ومن خلال الاستفادة من هذه المعلومات، يمكن للتطبيق إنشاء هياكل بيانات محسنة للقطاعات التي يمكن الوصول إليها من التطبيق.

لقطة كومة

أخيرًا، تقوم لقطة الكومة بإنشاء رسم بياني للكائن عن طريق اتباع مؤشرات الجذر مثل الحقول الثابتة لإنشاء عرض شامل لجميع الكائنات التي يمكن الوصول إليها. يقوم هذا الرسم البياني بعد ذلك بملء
الصورة الأصلية كومة الصور، مما يضمن تحميل الحالة الأولية للتطبيق بكفاءة عند بدء التشغيل.

لإنشاء الإغلاق المتعدي للكائنات التي يمكن الوصول إليها، تعبر الخوارزمية حقول الكائنات، وتقرأ قيمها باستخدام الانعكاس. من المهم ملاحظة أن أداة إنشاء الصور تعمل ضمن بيئة Java. يتم أخذ حقول المثيلات التي تم وضع علامة "قراءة" عليها فقط بواسطة تحليل النقاط في الاعتبار أثناء هذا الاجتياز. على سبيل المثال، إذا كانت الفئة تحتوي على حقلين مثيلين ولكن لم يتم وضع علامة على أحدهما كمقروء، فسيتم استبعاد الكائن الذي يمكن الوصول إليه من خلال الحقل غير المحدد من كومة الصور.

عند مواجهة قيمة حقل لم يتم تحديد فئتها مسبقًا بواسطة تحليل النقاط، يتم تسجيل الفئة كنوع حقل. يضمن هذا التسجيل أنه في التكرارات اللاحقة لتحليل النقاط، يتم نشر النوع الجديد إلى جميع قراءات الحقول والاستخدامات المتعدية في الرسم البياني لتدفق النوع.

يوضح مقتطف الكود أدناه الخوارزمية الأساسية لالتقاط لقطات الكومة:

Declare List worklist := []
Declare Set reachableObjects := []

Function BuildHeapSnapshot(PointsToState pointsToState)
For Each field in pointsToState.getReachableStaticObjectFields()
Call AddObjectToWorkList(field.readValue())
End For

    For Each method in pointsToState.getReachableMethods()
        For Each constant in method.embeddedConstants()
            Call AddObjectToWorkList(constant)
        End For
    End For

    While worklist.isNotEmpty
        Object current := Pop from worklist
        If current Object is an Array
            For Each value in current
                Call AddObjectToWorkList(value)
                Add current.getClass() to pointsToState.getObjectArrayTypes()
            End For
        Else
            For Each field in pointsToState.getReachableInstanceObjectFields(current.getClass())
                Object value := field.read(current)
                Call AddObjectToWorkList(value)
                Add value.getClass() to pointsToState.getFieldValueTypes(field)
            End For
        End If
    End While
    Return reachableObjects
End Function

باختصار، تقوم خوارزمية التقاط الكومة بإنشاء لقطة للكومة بكفاءة من خلال اجتياز الكائنات التي يمكن الوصول إليها وحقولها بشكل منهجي. وهذا يضمن تضمين الكائنات ذات الصلة فقط في كومة الصورة، مما يؤدي إلى تحسين الأداء وبصمة الذاكرة للصورة الأصلية.

خاتمة

في الختام، تلعب عملية التقاط الصور دورًا حاسمًا في إنشاء الصور الأصلية. من خلال اجتياز الكائنات التي يمكن الوصول إليها وحقولها بشكل منهجي، تقوم خوارزمية التقاط الكومة بإنشاء رسم بياني للكائن يمثل الإغلاق المتعدي للكائنات التي يمكن الوصول إليها من المؤشرات الجذرية مثل الحقول الثابتة. يتم بعد ذلك دمج هذا الرسم البياني للكائن في الصورة الأصلية باعتباره كومة الصورة، ليكون بمثابة الكومة الأولية عند بدء تشغيل الصورة الأصلية.

طوال العملية، تعتمد الخوارزمية على حالة تحليل النقاط لتحديد الكائنات والحقول ذات الصلة لتضمينها في كومة الصور. يتم أخذ الكائنات والحقول التي تم وضع علامة "مقروءة" عليها بواسطة تحليل النقاط في الاعتبار، بينما يتم استبعاد الكيانات غير المميزة. بالإضافة إلى ذلك، عند مواجهة أنواع غير مرئية سابقًا، تقوم الخوارزمية بتسجيلها للانتشار في التكرارات اللاحقة لتحليل النقاط.

بشكل عام، تعمل لقطة الكومة على تحسين الأداء واستخدام الذاكرة للصور الأصلية من خلال ضمان تضمين الكائنات الضرورية فقط في كومة الصورة. يعزز هذا النهج المنهجي كفاءة وموثوقية تنفيذ الصور الأصلية.

بيان الافراج يتم استنساخ هذا المقال على: https://dev.to/yanev/enhancing-performance-with-static-anymansy-dimage-initialization و heapshotting-263f؟1 إذا كان هناك أي انتهاك ، يرجى الاتصال بـ [email protected] لحذفه.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3