تحسين وقت بدء تشغيل التطبيق
تحسين وقت بدء تشغيل التطبيق
تحسين وقت بدء تشغيل التطبيق
https://developer.apple.com/videos/play/wwdc2016/406/
[موسيقى] صباح الخير ومرحبًا بكم في الجلسة 406، تحسين وقت بدء تشغيل التطبيق. [موسيقى] صباح الخير للجميع، ومرحبًا بكم في المحاضرة 406: تحسين وقت بدء تشغيل التطبيق.
اسمي نيك كليدزيك، واليوم سنأخذكم أنا وزميلي لويس في جولة إرشادية حول كيفية إطلاق العملية. اسمي نيك كليدزيك، واليوم سنأخذكم أنا وزميلي لويس في جولة حول كيفية بدء العملية.
ربما تتساءل الآن، هل هذا الموضوع مناسب لي؟ ربما تفكر الآن، هل هذا الموضوع مناسب لي؟
لذلك طلبنا من فريق التسويق المختص بالتطوير إجراء بعض الأبحاث، وتوصلوا إلى أن هناك ثلاث مجموعات ستستفيد من الاستماع إلى هذا الحديث. لذلك طلبنا من فريق التسويق الرائع لدينا إجراء بعض الأبحاث وحددوا أن هناك ثلاث مجموعات من الأشخاص سيستفيدون من سماع هذه المحادثة.
الأول، هو مطورو التطبيقات الذين لديهم تطبيق يتم تشغيله ببطء. الأول هو مطور التطبيقات الذي يكون تطبيقه بطيئًا في التشغيل.
المجموعة الثانية، هي مطوري التطبيقات الذين لا يريدون أن يكونوا في المجموعة الأولى [ضحك]. المجموعة الثانية، هم مطورو التطبيقات الذين لا يريدون أن يكونوا في المجموعة الأولى [ضحك].
وأخيرًا، هو أي شخص مهتم حقًا بكيفية عمل نظام التشغيل. وأخيرًا، من الذي لديه فضول لمعرفة كيفية عمل نظام التشغيل؟
لذلك سيتم تقسيم هذا الحديث إلى قسمين، الأول نظري أكثر والثاني عملي، وسأقوم بالجزء الأول النظري. لذلك سوف ينقسم هذا الحديث إلى قسمين، الجزء الأول نظري أكثر والجزء الثاني عملي أكثر، سأتحدث عن الجزء الأول.
وفيه سأرشدك عبر جميع الخطوات التي تحدث، وصولاً إلى الخطوات الرئيسية. سأأخذك خلال جميع الخطوات التي تحدث، وصولاً إلى الجسم الرئيسي.
ولكن لكي تتمكن من فهم وتقدير جميع الخطوات، أحتاج أولاً إلى إعطائك دورة تدريبية مكثفة حول Mach-O والذاكرة الافتراضية. ولكن لكي تفهمها وتقدرها، أحتاج أولاً إلى أن أقدم لك دورة تدريبية مكثفة في الحوسبة التناظرية والذاكرة الافتراضية.
لذا، أولًا، بعض مصطلحات Mach-O، بسرعة. أولاً بعض مصطلحات Mach-O.
Mach-O عبارة عن مجموعة من أنواع الملفات للملفات التنفيذية المختلفة في أوقات التشغيل. Mach-O عبارة عن مجموعة من أنواع الملفات للملفات التنفيذية المختلفة في وقت التشغيل.
لذا فإن الملف القابل للتنفيذ الأول، هو الملف الثنائي الرئيسي في التطبيق، وهو أيضًا الملف الثنائي الرئيسي في امتداد التطبيق. الملف القابل للتنفيذ الأول هو الملف الثنائي الرئيسي في التطبيق والملف الثنائي الرئيسي في ملحق التطبيق.
Dylib عبارة عن مكتبة ديناميكية، على الأنظمة الأساسية الأخرى، قد تعرف تلك باسم DSOs أو DLLs. dylib هي مكتبة ديناميكية، وعلى الأنظمة الأساسية الأخرى قد تعرفها باسم DSOs أو dlls.
تحتوي منصتنا أيضًا على نوع آخر يسمى الحزمة. تحتوي منصتنا أيضًا على شيء آخر يسمى الحزمة.
الآن أصبحت الحزمة عبارة عن نوع خاص من dylib لا يمكنك الارتباط به، كل ما يمكنك فعله هو تحميلها في وقت التشغيل بواسطة dlopen ويتم استخدامها في نظام التشغيل Mac OS للمكونات الإضافية. الحزمة عبارة عن dylib خاص لا يمكنك الارتباط به، كل ما يمكنك فعله هو تحميله في وقت التشغيل عبر dlopen، والذي يُستخدم للمكونات الإضافية في نظام التشغيل Mac OS.
وأخيرا، هو مصطلح الصورة. وأخيرا هناك صور.
تشير الصورة إلى أي من هذه الأنواع الثلاثة. تشير الصورة إلى أي من هذه الأنواع الثلاثة.
وسأستخدم هذا المصطلح كثيرًا. سأستخدم هذه الكلمة كثيرًا.
وأخيرًا، مصطلح إطار العمل مثقل جدًا في صناعتنا، ولكن في هذا السياق، إطار العمل هو dylib مع بنية دليل خاصة حوله للاحتفاظ بالملفات التي يحتاجها ذلك dylib. أخيرًا، مصطلح إطار العمل مثقل جدًا في صناعتنا، ولكن في هذا السياق، إطار العمل هو dylib الذي يحتوي على بنية دليل خاصة حوله للاحتفاظ بالملفات التي يحتاجها dylib.
لذلك دعونا نتعمق في تنسيق صورة Mach-O. دعنا ننتقل مباشرة إلى تنسيق صورة Mach-O.
يتم تقسيم صورة Mach-O إلى مقاطع، وفقًا للاتفاقية، تستخدم جميع أسماء المقاطع أحرفًا كبيرة. يتم تقسيم صورة Mach-O إلى مقاطع، ووفقًا للاتفاقية، تكون جميع أسماء المقاطع مكتوبة بأحرف كبيرة.
الآن، كل جزء دائمًا ما يكون مضاعفًا لحجم الصفحة، في هذا المثال النص هو 3 صفحات، والبيانات وLINKEDIT هي كل صفحة واحدة. الآن، يكون كل جزء دائمًا مضاعفًا لحجم الصفحة، في هذا المثال، النص هو 3 صفحات والبيانات وLINKEDIT كلاهما صفحة واحدة.
الآن يتم تحديد حجم الصفحة بواسطة الأجهزة، بالنسبة لـarm64، حجم الصفحة هو 16 كيلو بايت، وكل شيء آخر هو 4 كيلو بايت. الآن يتم تحديد حجم الصفحة بواسطة الأجهزة، بالنسبة لـarm64، يبلغ حجم الصفحة 16 كيلو بايت، والبعض الآخر 4 كيلو بايت.
الآن هناك طريقة أخرى للنظر إلى الشيء وهي الأقسام. نهج آخر هو التجزئة.
إذن الأقسام هي شيء يحذفه المترجم. لذلك يتم تجاهل جزء منه من قبل المترجم.
لكن الأقسام هي في الواقع مجرد نطاق فرعي لشريحة ما، ولا تحتوي على أي من القيود المتعلقة بحجم الصفحة، ولكنها غير متداخلة. لكن القسم هو في الواقع مجرد نطاق فرعي من القطعة. ليس لها حدود لحجم الصفحة، ولكنها لا تتداخل.
الآن، أسماء المقاطع الأكثر شيوعًا هي TEXT وDATA وLINKEDIT، وفي الواقع يحتوي كل ثنائي تقريبًا على تلك المقاطع الثلاثة بالضبط. في الوقت الحاضر، أسماء المقاطع الأكثر شيوعًا هي TEXT وDATA وLINKEDIT. في الواقع، يحتوي كل ثنائي تقريبًا على هذه الأجزاء الثلاثة.
يمكنك إضافة عناصر مخصصة ولكنها عادةً لا تضيف أي قيمة. يمكنك إضافة قيم مخصصة، ولكن عادةً لن تتم إضافة أي قيم.
إذن ما هي هذه المستخدمة؟ حسنًا، يوجد النص في بداية الملف، ويحتوي على رأس Mach، ويحتوي على أي تعليمات للجهاز بالإضافة إلى أي ثابت للقراءة فقط مثل سلاسل c. لماذا هذه؟ النص موجود في بداية الملف، ويحتوي على رأس Mach، الذي يحتوي على أي تعليمات للجهاز بالإضافة إلى ثوابت للقراءة فقط، مثل سلاسل c.
تمت إعادة كتابة مقطع البيانات، ويحتوي مقطع البيانات على كافة المتغيرات العامة الخاصة بك. تتم إعادة كتابة مقطع البيانات ويحتوي على كافة المتغيرات العامة.
وأخيرًا، هو LINKEDIT. وأخيراً لينكديت.الآن لا يحتوي LINKEDIT على وظائف المتغيرات العامة الخاصة بك، ويحتوي LINKEDIT على معلومات حول وظيفة المتغيرات الخاصة بك مثل اسمها وعنوانها. LINKEDIT لا يحتوي على وظائف المتغيرات العامة، بل يحتوي على معلومات حول وظائف المتغيرات، مثل أسمائها وعناوينها.
ربما سمعت أيضًا عن الملفات العامة، فما هي؟ حسنًا، لنفترض أنك قمت بإنشاء تطبيق iOS، لنظام 64 بت، والآن لديك ملف Mach-O هذا، فماذا يحدث للكود التالي عندما تقول أنك تريد أيضًا إنشاءه لأجهزة 32 بت؟ عند إعادة البناء، سيقوم Xcode ببناء ملف Mach-O منفصل آخر، هذا الملف مصمم لـ 32 بت، RB7. ربما سمعت أيضًا عن الملفات العامة، فما هي؟ لنفترض أنك قمت بإنشاء تطبيق iOS لنظام 64 بت والآن لديك ملف Mach-O هذا، فماذا يحدث بعد ذلك عندما تقول أنك تريد إنشاءه لأجهزة 32 بت أيضًا؟ عندما تقوم بإعادة البناء، سيقوم Xcode ببناء ملف Mach-O منفصل آخر، هذا الملف مصمم لـ 32 بت، RB7.
وبعد ذلك يتم دمج هذين الملفين في ملف ثالث يسمى ملف Mach-O العالمي. يتم بعد ذلك دمج هذين الملفين في ملف ثالث يسمى ملف Mach-O العالمي.
وهذا يحتوي على رأس في البداية، وكل الرأس يحتوي على قائمة بجميع البنيات وما هي إزاحاتها في الملف. يحتوي على رأس في البداية يحتوي على قائمة بجميع البنيات وإزاحاتها في الملف.
وهذا الرأس أيضًا بحجم صفحة واحدة. العنوان هو أيضًا بحجم الصفحة.
ربما تتساءل الآن، لماذا تتعدد أحجام الصفحات للشرائح؟ لماذا يكون حجم الرأس بحجم الصفحة، ويضيع الكثير من المساحة. ربما تتساءل الآن، لماذا تتعدد أحجام الصفحات للشرائح؟ لماذا تكون الرؤوس بحجم صفحة واحدة، فهي تهدر مساحة كبيرة.
حسنًا، السبب وراء اعتماد كل شيء على الصفحة له علاقة بموضوعنا التالي وهو الذاكرة الافتراضية. السبب وراء كون كل شيء يعتمد على الصفحة يتعلق بموضوعنا التالي وهو الذاكرة الافتراضية.
إذن ما هي الذاكرة الافتراضية؟ ربما يعرف البعض منكم القول المأثور في هندسة البرمجيات بأن كل مشكلة يمكن حلها عن طريق إضافة مستوى من المراوغة. إذن ما هي الذاكرة الافتراضية؟ ربما يعرف البعض منكم القول المأثور في هندسة البرمجيات بأن كل مشكلة يمكن حلها عن طريق إضافة مستوى من المراوغة.
لذا فإن المشكلة التي تحلها الذاكرة الافتراضية هي كيف يمكنك إدارة كل ذاكرة الوصول العشوائي الفعلية الخاصة بك عندما يكون لديك كل هذه العمليات؟ لذلك أضافوا القليل من المراوغة. لذا فإن المشكلة التي تحلها الذاكرة الافتراضية هي، كيف يمكنك إدارة كل ذاكرة الوصول العشوائي الفعلية عندما يكون لديك كل هذه العمليات؟ لذلك يضيفون بعض المراوغة.
كل عملية عبارة عن مساحة عنوان منطقية يتم تعيينها لبعض الصفحات الفعلية من ذاكرة الوصول العشوائي (RAM). كل عملية عبارة عن مساحة عنوان منطقية، والتي يتم تعيينها لصفحة فعلية معينة من ذاكرة الوصول العشوائي (RAM).
الآن، ليس من الضروري أن يكون هذا التعيين واحدًا لواحد، حيث يمكن أن يكون لديك عناوين منطقية لا تذهب إلى ذاكرة الوصول العشوائي الفعلية ويمكن أن يكون لديك عناوين منطقية متعددة تذهب إلى نفس ذاكرة الوصول العشوائي الفعلية. الآن، ليس من الضروري أن يكون هذا التعيين واحدًا لواحد، حيث يمكنك الحصول على عناوين منطقية لا تنتقل إلى ذاكرة الوصول العشوائي الفعلية، أو يمكنك الحصول على عناوين منطقية متعددة تذهب إلى نفس ذاكرة الوصول العشوائي الفعلية.
لقد أتاح هذا الكثير من الفرص هنا. وهذا يوفر العديد من الفرص.
إذن ماذا يمكنك أن تفعل مع VM؟ حسنًا أولاً، إذا كان لديك عنوان منطقي لا يتم تعيينه لأي ذاكرة وصول عشوائي فعلية، فعند الوصول إلى هذا العنوان في العملية، يحدث خطأ في الصفحة. إذن ما الذي يمكن أن يفعله VM؟ أولاً، إذا كان هناك عنوان منطقي لم يتم تعيينه لأي ذاكرة وصول عشوائي فعلية، وعند الوصول إلى هذا العنوان في إحدى العمليات، سيحدث خطأ في الصفحة.
عند هذه النقطة تقوم النواة بإيقاف هذا الخيط وتحاول معرفة ما يجب أن يحدث. عند هذه النقطة، توقف النواة الخيط وتحاول معرفة ما يجب أن يحدث.
والشيء التالي هو أنه إذا كان لديك عمليتان، بعناوين منطقية مختلفة، يتم تعيينهما إلى نفس الصفحة الفعلية، فإن هاتين العمليتين تشتركان الآن في نفس الجزء من ذاكرة الوصول العشوائي (RAM). بعد ذلك، إذا كان لديك عمليتان بعناوين منطقية مختلفة، تم تعيينهما على نفس الصفحة الفعلية، فإن كلتا العمليتين تشتركان الآن في نفس وحدات البت من ذاكرة الوصول العشوائي (RAM).
لديك الآن المشاركة بين العمليات. يمكنك الآن المشاركة بين العمليات.
ميزة أخرى مثيرة للاهتمام هي رسم الخرائط المدعومة بالملفات. ميزة أخرى مثيرة للاهتمام هي تعيين دعم الملفات.
بدلاً من قراءة ملف كامل فعليًا في ذاكرة الوصول العشوائي (RAM)، يمكنك إخبار نظام VM من خلال استدعاء mmap، وأريد تعيين هذه الشريحة من هذا الملف إلى نطاق العناوين هذا في عمليتي. يمكنك إخبار نظام VM عبر استدعاء mmap أنه بدلاً من قراءة الملف بأكمله في ذاكرة الوصول العشوائي (RAM)، أريد تعيين هذا الجزء من الملف إلى نطاق العناوين هذا في العملية.
فلماذا تفعل ذلك؟ حسنًا، بدلًا من الاضطرار إلى قراءة الملف بأكمله، من خلال إعداد هذا التعيين، عند وصولك لأول مرة إلى تلك العناوين المختلفة، كما لو كنت قد قرأته في الذاكرة، في كل مرة تصل فيها إلى عنوان لم يتم الوصول إليه قبل أن يتسبب ذلك في حدوث خطأ في الصفحة، ستقرأ النواة تلك الصفحة الواحدة فقط. فلماذا تفعل ذلك؟ بدلاً من الاضطرار إلى قراءة الملف بأكمله، الذي تم إعداده بواسطة الخريطة، عند الوصول لأول مرة إلى هذه العناوين المختلفة، إذا قرأته في الذاكرة، ففي كل مرة تصل فيها إلى عنوان لم يتم الوصول إليه من قبل، سيؤدي ذلك إلى حدوث خطأ في الصفحة وستقوم النواة بقراءة الصفحة.
وهذا يمنحك قراءة كسولة لملفك. هذا سيجعلك كسولًا لقراءة المستند الخاص بك.
الآن يمكننا جمع كل هذه الميزات معًا، وما أخبرتك به عن Mach-O تدرك الآن أن مقطع النص لأي من تلك الصور أو تلك الصور يمكن تعيينها إلى عمليات متعددة، وسيتم قراءتها بتكاسل، ويمكن مشاركة كل تلك الصفحات بين تلك العمليات. الآن يمكننا جمع كل هذه الميزات معًا، وقد أخبرتك Mach-o أنك تدرك الآن أن مقطع النص لأي ديليب أو صورة يمكن تعيينه إلى عمليات متعددة، وسيتم قراءته بتكاسل، ويمكن مشاركة كل تلك الصفحات بين تلك العمليات.
ماذا عن شريحة البيانات؟ تتم قراءة مقطع البيانات وكتابته، لذلك لدينا خدعة تسمى النسخ عند الكتابة، وهي تشبه إلى حد ما الاستنساخ الذي يظهر في نظام ملفات Apple. ماذا عن شريحة البيانات؟ تتم قراءة وكتابة مقطع البيانات، لذلك لدينا ما يسمى بتقنية النسخ عند الكتابة، والتي تشبه إلى حد ما الاستنساخ كما هو موضح في نظام ملفات Apple.ما يفعله النسخ والكتابة هو أنه يشارك بشكل متفائل صفحة البيانات بين جميع العمليات. ما يفعله النسخ والكتابة هو مشاركة صفحات البيانات بشكل متفائل بين جميع العمليات.
ماذا يحدث عند عملية واحدة، طالما أنهم يقرأون فقط من المتغيرات العالمية التي تعمل بها المشاركة. ماذا يحدث عندما تعمل مشاركات العملية طالما أنها تقرأ فقط من المتغيرات العامة.
ولكن بمجرد أن تحاول إحدى العمليات فعليًا الكتابة إلى صفحة البيانات الخاصة بها، تتم عملية النسخ والكتابة. ولكن بمجرد أن تحاول العملية فعليًا الكتابة إلى صفحات البيانات الخاصة بها، تحدث عملية نسخ وكتابة.
يؤدي النسخ والكتابة إلى قيام النواة بعمل نسخة من تلك الصفحة في ذاكرة وصول عشوائي فعلية أخرى وإعادة توجيه التعيين للانتقال إلى ذلك. يؤدي النسخ والكتابة إلى قيام النواة بنسخ الصفحة إلى ذاكرة وصول عشوائي فعلية أخرى وإعادة توجيه التعيين إلى ذاكرة الوصول العشوائي الفعلية تلك.
بحيث تمتلك هذه العملية الآن نسختها الخاصة من تلك الصفحة. لذا فإن العملية لديها الآن نسختها الخاصة من الصفحة.
وهو ما يقودنا إلى الصفحات النظيفة مقابل الصفحات القذرة. وهذا يقودنا إلى الصفحة النظيفة والقذرة.
لذلك تعتبر تلك النسخة صفحة قذرة. لذلك تعتبر تلك النسخة صفحة قذرة.
الصفحة القذرة هي شيء يحتوي على معلومات محددة للعملية. الصفحات المتسخة هي صفحات تحتوي على معلومات خاصة بالعملية.
الصفحة النظيفة هي شيء يمكن للنواة تجديده لاحقًا إذا لزم الأمر، مثل إعادة القراءة من القرص. الصفحة النظيفة هي تلك التي يمكن للنواة إعادة إنشائها إذا لزم الأمر لاحقًا، مثل إعادة القراءة من القرص.
لذا فإن الصفحات المتسخة أغلى بكثير من الصفحات النظيفة. لذا فإن الصفحات المتسخة أغلى بكثير من الصفحات النظيفة.
وآخر شيء هو أن حدود الأذونات موجودة على حدود الصفحة. النقطة الأخيرة هي أن حدود الأذونات موجودة على حدود الصفحة.
أعني بذلك أن الأذونات هي أنه يمكنك وضع علامة على صفحة قابلة للقراءة، أو قابلة للكتابة، أو قابلة للتنفيذ، أو أي مجموعة من هذه. ما أعنيه بالأذونات هو أنه يمكنك وضع علامة على الصفحة على أنها قابلة للقراءة، أو قابلة للكتابة، أو قابلة للتنفيذ، أو أي مزيج من هذه.
لذلك دعونا نجمع كل هذا معًا، لقد تحدثت عن تنسيق Mach-O، وشيء يتعلق بالذاكرة الافتراضية، دعونا نرى كيف يلعبون معًا. دعونا نجمع هذا معًا، لقد تحدثت عن تنسيق Mach-O، قليلًا عن الذاكرة الافتراضية، ودعونا نرى كيف يعملون معًا.
الآن سوف أتخطى الأمر وأتحدث قليلاً، عن كيفية عمل dyld وفي لحظات قليلة سأرشدك خلال هذا ولكن في الوقت الحالي، أريد فقط أن أوضح لك كيفية تعيين هذا بين Mach-O والذاكرة الافتراضية. الآن سوف أتخطى قليلاً وأتحدث قليلاً عن كيفية عمل dyld، وسأرشدك خلال هذا بالتفصيل بعد قليل، لكن في الوقت الحالي، أريد فقط أن أوضح لك كيفية تعيين هذا بين Mach-O والذاكرة الافتراضية.
إذن لدينا ملف dylib هنا، وبدلاً من قراءته في الذاكرة قمنا بتعيينه في الذاكرة. لدينا ملف dylib هنا، وبدلاً من قراءته في الذاكرة، نقوم بتعيينه في الذاكرة.
لذا، في الذاكرة، كان هذا الديليب سيستغرق ثماني صفحات. في الذاكرة، يستغرق هذا الديليب 8 صفحات.
المدخرات، سبب اختلافها هي هذه ZeroFills. ما يجعلها مختلفة هو هذه الحشوات الصفرية.
لذا يتبين أن معظم المتغيرات العالمية تكون صفرًا في البداية. لذا فإن معظم المتغيرات العالمية تبدأ بالرقم 0.
لذا فإن [غير مسموع] الثابت يقوم بإجراء تحسين ينقل جميع المتغيرات العالمية الصفرية إلى النهاية، ومن ثم لا يشغل أي مساحة على القرص. لذلك تم تحسين [غير مسموع] الثابت لنقل كافة المتغيرات العامة 0 إلى النهاية ومن ثم عدم شغل أي مساحة على القرص.
وبدلاً من ذلك، نستخدم ميزة VM لإخبار VM عند الوصول إلى هذه الصفحة لأول مرة، بملئها بالأصفار. بدلاً من ذلك، نستخدم ميزة VM لنطلب من VM أن يملأها بالأصفار في المرة الأولى التي يصل فيها إلى هذه الصفحة.
لذلك فهو لا يتطلب القراءة. لذلك لا يتطلب القراءة.
لذا فإن أول شيء يجب على dyld فعله هو إلقاء نظرة على رأس Mach، في الذاكرة، في هذه العملية. لذا فإن أول شيء يفعله dyld هو إلقاء نظرة على رأس Mach في الذاكرة أثناء هذه العملية.
لذلك سيتم النظر إلى المربع العلوي في الذاكرة، وعندما يحدث ذلك، لا يوجد شيء هناك، ولا يوجد تعيين لصفحة فعلية، لذلك يحدث خطأ في الصفحة. سوف يرى المربع العلوي في الذاكرة وعندما يحدث ذلك، لا يوجد شيء هناك، ولا يوجد تعيين للصفحة الفعلية، لذلك يحدث خطأ الصفحة.
عند هذه النقطة، تدرك النواة أن هذا قد تم تعيينه لملف، لذلك ستقوم بقراءة الصفحة الأولى من الملف، ووضعها في ذاكرة الوصول العشوائي الفعلية، وتعيين التعيين لها. عند هذه النقطة، تدرك النواة أن الخريطة موجودة في ملف، لذا تقرأ الصفحة الأولى من الملف، وتضعها في ذاكرة الوصول العشوائي الفعلية، وتقوم بتعيين الخريطة عليها.
الآن يمكن لـ dyld البدء في القراءة من خلال رأس Mach. الآن، يمكن لـ dyld البدء في قراءة رأس Mach.
يتم قراءته من خلال رأس Mach، ويقول رأس Mach أوه، هناك بعض المعلومات في مقطع LINKEDIT الذي تحتاج إلى إلقاء نظرة عليه. سوف يقرأ رأس Mach، وسيقول رأس Mach أن هناك بعض المعلومات في جزء LINKEDIT الذي يحتاج إلى رؤيته.
لذا مرة أخرى، يقوم dyld بإسقاط ما هو موجود في المربع السفلي في العملية الأولى. مرة أخرى، يقوم dyld بوضع محتويات الصندوق السفلي من العملية 1.
والذي يسبب خطأ الصفحة مرة أخرى. سيؤدي هذا مرة أخرى إلى حدوث خطأ في الصفحة.
يخدمها Kernel من خلال القراءة في صفحة فعلية أخرى من ذاكرة الوصول العشوائي (RAM)، وهي LINKEDIT. تخدمها النواة من خلال القراءة في صفحة فعلية أخرى LINKEDIT من ذاكرة الوصول العشوائي.
الآن يمكن لـ dyld أن يتوقع LINKEDIT. الآن، يمكن لديلد أن يتطلع إلى LINKEDIT.
الآن قيد المعالجة، سيخبر LINKEDIT dyld، أنك بحاجة إلى إجراء بعض الإصلاحات على صفحة البيانات هذه لجعل dylb هذا قابلاً للتشغيل. الآن، أثناء هذه العملية، سيخبر LINKEDIT dyld أنك بحاجة إلى إجراء بعض الإصلاحات على صفحة البيانات هذه لجعل dylib قابلاً للتشغيل.
لذلك، يحدث نفس الشيء، dyld الآن، يقرأ بعض البيانات من صفحة البيانات، ولكن هناك شيء مختلف هنا. يحدث نفس الشيء، يقرأ dyld الآن بعض البيانات من صفحة البيانات، ولكن شيئًا مختلفًا هنا.
سيقوم dyld بالفعل بكتابة شيء ما مرة أخرى، وسيقوم بالفعل بتغيير صفحة البيانات هذه وفي هذه المرحلة، تحدث نسخة عند الكتابة. سوف يقوم dyld بكتابة شيء ما مرة أخرى، وسيغير صفحة البيانات هذه، وفي هذا الوقت، سيحدث النسخ عند الكتابة.
وتصبح هذه الصفحة قذرة. هذه الصفحة أصبحت قذرة.فماذا كان يمكن أن يكون 8 صفحات من ذاكرة الوصول العشوائي المتسخة إذا قمت فقط بتجميع ثماني صفحات ثم قرأت الأشياء فيها، سيكون لدي ثماني صفحات من ذاكرة الوصول العشوائي المتسخة. إذن ما هي الذاكرة القذرة المكونة من 8 صفحات؟ إذا أخطأت في وضع 8 صفحات ثم قرأتها، سيكون لدي 8 صفحات من الذاكرة القذرة.
ولكن الآن ليس لدي سوى صفحة واحدة من ذاكرة الوصول العشوائي المتسخة وصفحتين نظيفتين. لكن الآن ليس لدي سوى صفحة واحدة من الذاكرة القذرة وصفحتين من الذاكرة النظيفة.
فماذا سيحدث عندما تقوم العملية الثانية بتحميل نفس dylib. فماذا يحدث عندما تقوم العملية الثانية بتحميل نفس dylib.
لذا، في العملية الثانية، يمر dyld بنفس الخطوات. في التمريرة الثانية، يمر ديلد بنفس الخطوات.
أولاً، تنظر إلى رأس Mach، لكن هذه المرة تقول النواة، آه، لدي بالفعل تلك الصفحة في ذاكرة الوصول العشوائي (RAM) في مكان ما، لذا فهي ببساطة تعيد توجيه التعيين لإعادة استخدام تلك الصفحة ولم يتم إجراء عملية iO. أولاً، تنظر إلى رأس Mach، لكن هذه المرة تقول النواة، آه، لدي بالفعل تلك الصفحة في مكان ما في ذاكرة الوصول العشوائي (RAM)، لذا فهي تعيد توجيه الخريطة لإعادة استخدام تلك الصفحة، بدون أجهزة iOS.
نفس الشيء مع LINKEDIT، فهو أسرع بكثير. مثل LINKEDIT، فهو أسرع.
نصل الآن إلى صفحة البيانات، وفي هذه المرحلة يجب على النواة أن تبحث لمعرفة ما إذا كانت صفحة البيانات، والنسخة النظيفة لا تزال موجودة بالفعل في ذاكرة الوصول العشوائي في مكان ما، وإذا كانت موجودة فيمكن إعادة استخدامها، وإذا لم يكن الأمر كذلك، فيجب عليها إعادة قراءتها. الآن دعونا نلقي نظرة على صفحة البيانات، في هذه المرحلة يجب على النواة أن تنظر إلى صفحة البيانات وترى ما إذا كانت النسخة النظيفة لا تزال موجودة في مكان ما في ذاكرة الوصول العشوائي، وإذا حدث ذلك فيمكن إعادة استخدامها، وإذا لم يكن الأمر كذلك، فيجب عليها إعادة قراءتها.
والآن في هذه العملية، سوف يقوم dyld بتسخين ذاكرة الوصول العشوائي. في هذه العملية، dyld يلوث ذاكرة الوصول العشوائي.
الآن الخطوة الأخيرة هي أن LINKEDIT مطلوب فقط أثناء قيام dyld بعملياته. الخطوة الأخيرة هي LINKEDIT وهي مطلوبة فقط عندما يقوم dyld بتنفيذ العملية.
لذلك يمكن أن تلمح إلى النواة، بمجرد الانتهاء من ذلك، أنها لم تعد بحاجة إلى صفحات LINKEDIT هذه بعد الآن، ويمكنك استعادتها عندما يحتاج شخص آخر إلى ذاكرة الوصول العشوائي. يمكن أن يلمح إلى النواة أنه بمجرد الانتهاء من ذلك، فإنها لن تحتاج إلى صفحات LINKEDIT هذه بعد الآن ويمكنك استعادتها عندما يحتاج شخص آخر إلى ذاكرة الوصول العشوائي.
وبالتالي فإن النتيجة هي الآن أن لدينا عمليتان لمشاركة هذه الـ dylibs، كل واحدة منها كانت ستتكون من ثماني صفحات، أو ما مجموعه 16 صفحة قذرة، ولكن الآن لدينا فقط صفحتين قذرتين وصفحة واحدة نظيفة ومشتركة. والنتيجة هي أنه لدينا الآن عمليتان لمشاركة هذه الديليبس، كل منها تحتوي على 8 صفحات، أو 16 صفحة قذرة إجمالاً، ولكن الآن لدينا فقط صفحتان قذرتان وصفحة مشتركة واحدة نظيفة.
هناك شيئان ثانويان آخران أريد أن أتطرق إليهما وهما كيفية تأثير التأثيرات الأمنية على dyld، هذين الأمرين الأمنيين الكبيرين اللذين أثرا على dyld. الأمران الصغيران الآخران اللذان أريد التحدث عنهما هما كيفية تأثير الأمن على dyld، وهذان الأمران الكبيران يؤثران على dyld.
أحدها هو ASLR، التوزيع العشوائي لتخطيط مساحة العنوان، وهي تقنية قديمة عمرها عقد أو عقدين من الزمن، حيث تقوم بشكل أساسي بترتيب عنوان التحميل بشكل عشوائي. إحداها هي ASLR، التوزيع العشوائي لتخطيط مساحة العنوان، وهي تقنية من عشرة إلى عشرين عامًا مضت حيث تقوم بشكل أساسي بتحميل العناوين بشكل عشوائي.
والثاني هو توقيع التعليمات البرمجية، لا بد من ذلك، لقد اضطر الكثير منكم إلى التعامل مع توقيع التعليمات البرمجية، في Xcode، وتفكر في توقيع التعليمات البرمجية، حيث تقوم بتشغيل تجزئة تشفير على الملف بأكمله، ثم توقعه بتوقيعك. والثاني هو توقيع التعليمات البرمجية. لقد تعامل الكثير من الأشخاص مع تسجيل التعليمات البرمجية في Xcode. توقيع الكود هو مجرد تشغيل تجزئة تشفير على الملف بأكمله ثم توقيعه بالتوقيع.
حسنًا، من أجل التحقق من صحة وقت التشغيل هذا، فهذا يعني أنه يجب إعادة قراءة الملف بأكمله. من أجل التحقق من وقت التشغيل، هذا يعني أنه يجب إعادة قراءة الملف بأكمله.
لذا بدلًا من ذلك، ما يحدث فعليًا في وقت الإنشاء، هو أن كل صفحة من ملف Mach-O الخاص بك تحصل على تجزئة تشفير فردية خاصة بها. إذن ما يحدث فعليًا في وقت الإنشاء هو أن كل صفحة من ملف Mach-O لها تجزئة التشفير الخاصة بها.
ويتم تخزين كل تلك التجزئات في LINKEDIT. يتم تخزين جميع جداول التجزئة هذه في LINKEDIT.
يتيح ذلك التحقق من صحة كل صفحة بحيث لم يتم العبث بها وأنها كانت مملوكة لك في الصفحة في الوقت المناسب. يعمل هذا على التحقق من كل صفحة للتأكد من عدم التلاعب بها وأنها الصفحة التي كنت تمتلكها عندما كنت في الصفحة.
حسنًا، لقد انتهينا من الدورة التدريبية المكثفة، والآن سأقوم بتوجيهك من المدير التنفيذي إلى القسم الرئيسي. حسنًا، لقد أكملنا الدورة التدريبية المكثفة، والآن سأنقلك من المستوى التنفيذي إلى المستوى الرئيسي.
إذن ما هو التنفيذ التنفيذي؟ Exec هو استدعاء النظام. إذن ما هو التنفيذ التنفيذي؟ Exec هو استدعاء النظام.
عندما تحاصر النواة، فإنك تقول بشكل أساسي أنني أريد استبدال هذه العملية بهذا البرنامج الجديد. عندما تتعثر في النواة، يمكنك أن تقول بشكل أساسي أنني أريد استبدال هذه العملية بهذا البرنامج الجديد.
تقوم النواة بمسح مساحة العنوان بالكامل وتعيينها في الملف القابل للتنفيذ الذي حددته. تقوم النواة بمسح وتعيين مساحة العنوان بالكامل في الملف القابل للتنفيذ المحدد.
الآن بالنسبة لـ ASLR، يقوم بتعيينه على عنوان عشوائي. بالنسبة لـ ASLR، يتم تعيينه إلى عنوان عشوائي.
والشيء التالي الذي يفعله هو من ذلك العشوائي، والعودة إلى الصفر، فهو يشير إلى أن المنطقة بأكملها لا يمكن الوصول إليها، وأعني بذلك أنه تم وضع علامة عليها على أنها غير قابلة للقراءة، وغير قابلة للكتابة، وغير قابلة للتنفيذ. والشيء التالي الذي يفعله هو من ذلك العشوائي، والعودة إلى 0، فهو يحدد المنطقة بأكملها على أنها غير قابلة للوصول، أعني أنها تحددها على أنها غير قابلة للقراءة، وغير قابلة للكتابة، وغير قابلة للتنفيذ.
يبلغ حجم هذه المنطقة على الأقل 4 كيلو بايت إلى 32 بت للعمليات و4 جيجا بايت على الأقل لعمليات 64 بت. يجب أن يكون حجم هذه المنطقة 4 كيلو بايت على الأقل لعمليات 32 بت و4 جيجا بايت لعمليات 64 بت.
يؤدي هذا إلى التقاط أي مراجع مؤشر NULL ويتوقع أيضًا المزيد من البتات، ويلتقط أي اقتطاعات للمؤشر. فهو يلتقط أي مراجع مؤشر فارغة، ويتوقع المزيد من البتات، ويلتقط أي اقتطاع للمؤشر.
الآن، كانت الحياة سهلة خلال العقدين الأولين من نظام Unix، لأن كل ما أفعله هو تعيين برنامج، وإعداد جهاز الكمبيوتر عليه، والبدء في تشغيله. خلال العقود القليلة الأولى، كانت الحياة على نظام يونكس بسيطة لأن كل ما فعلته هو رسم خريطة لأحد البرامج، ووضع جهاز الكمبيوتر الخاص بي فيه، والبدء في تشغيله.
ومن ثم تم اختراع المكتبات المشتركة. ثم تم اختراع المكتبات المشتركة.إذن من يقوم بتحميل dylibs؟ لقد أدركوا بسرعة أن الأمر أصبح معقدًا بسرعة كبيرة وأن الأشخاص العاملين في النواة لم يرغبوا في أن تقوم النواة بذلك، لذلك تم إنشاء برنامج مساعد بدلاً من ذلك. إذن من قام بتثبيت dylibs؟ وسرعان ما أدركوا أنهم أصبحوا معقدين للغاية بسرعة كبيرة وأن الأشخاص العاملين في النواة لم يرغبوا في أن تقوم النواة بذلك، لذلك تم إنشاء برنامج مساعد.
في منصتنا يطلق عليه dyld. منصتنا تسمى dyld.
في أنظمة Unix الأخرى، قد تعرفه باسم LD. في أنظمة يونكس الأخرى قد تعرفه باسم LD.
لذا. لذا.
لذلك عندما تنتهي النواة من تعيين عملية ما، فإنها تقوم الآن بتعيين Mach-O آخر يسمى dyld في تلك العملية على عنوان عشوائي آخر. لذلك عندما تنتهي النواة من تعيين العملية، فإنها تقوم الآن بتعيين Mach-O آخر يسمى dyld في العملية على عنوان عشوائي آخر.
اضبط جهاز الكمبيوتر على dyld ودعنا ننهي عملية dyld. اضبط جهاز الكمبيوتر على dyld واترك dyld ينهي بدء العملية.
إذن الآن يتم تشغيل dyld وتتمثل مهمتها في تحميل جميع dylibs التي تعتمد عليها وإعداد كل شيء وتشغيله. الآن بعد أن تم تشغيل dyld، فإن وظيفته هي تحميل جميع dylibs التي تعتمد عليها وتجهيز كل شيء وتشغيله.
لذلك دعونا نسير عبر تلك الخطوات. دعونا نلقي نظرة على الخطوات.
هذه مجموعة كاملة من الخطوات ولها نوع من الجدول الزمني على طول الجزء السفلي هنا، وبينما نسير عبر هذه الخطوات، سنسير عبر الجدول الزمني. إنها سلسلة من الخطوات ولها جدول زمني في الأسفل، وبينما نمر بهذه الخطوات نمر عبر الجدول الزمني.
أول شيء، هو أن dyld يجب أن يرسم خريطة لجميع dylibs التابعة. أولاً، يحتاج dyld إلى تعيين جميع dylibs التابعة.
حسنا ما هي dylibs التابعة؟ للعثور على تلك المكتبات، يقرأ أولاً رأس الملف الرئيسي القابل للتنفيذ، حيث أن النواة التي تم تعيينها بالفعل في هذا الرأس هي قائمة بجميع المكتبات التابعة. ما هي dylibs التابعة؟ للعثور على هذه الملفات، يقرأ أولاً الرأس الرئيسي القابل للتنفيذ الذي قامت النواة بتعيينه في رأس الملف، وهو عبارة عن قائمة بجميع المكتبات التابعة.
لذلك يجب تحليل ذلك. يجب تحليلها.
ثم عليه أن يجد كل dylib. ثم عليه أن يجد كل dylib.
وبمجرد العثور على كل ملف، يجب عليه فتح وتشغيل بداية كل ملف، ويجب التأكد من أنه ملف Mach-O، والتحقق من صحته، والعثور على توقيع الرمز الخاص به، وتسجيل توقيع الرمز هذا في النواة. بمجرد العثور على كل dylib، يجب عليه فتح بداية كل ملف وتشغيله، ويحتاج إلى التأكد من أنه ملف Mach-O، والتحقق منه، والعثور على توقيع الكود الخاص به، وتسجيل توقيع الكود مع النواة.
وبعد ذلك يمكنه بالفعل استدعاء mmap في كل مقطع في هذا dylib. ثم يمكنه استدعاء mmap على كل جزء في dylib.
حسنًا، هذا بسيط جدًا. بسيط جدا.
يعرف تطبيقك عن kernel dyld، ثم يقول dyld أوه، هذا التطبيق يعتمد على A وB dylib، قم بتحميل الاثنين، لقد انتهينا. يعرف التطبيق الخاص بك عن kernel dyld، ثم يقول dyld، هذا التطبيق يعتمد على dylibs A وB، قم بتحميل هذين الاثنين وانتهينا.
حسنًا، يصبح الأمر أكثر تعقيدًا، لأن A. يصبح الأمر أكثر تعقيدًا لأن أ.
ديليب و ب. ديليب و ب.
يمكن أن يعتمد الديليب أنفسهم على الديليب. dylibs أنفسهم يمكن أن يعتمدوا على dylibs.
لذلك يتعين على dyld أن يفعل الشيء نفسه مرة أخرى لكل من تلك dylibs، وقد يعتمد كل من dylibs على شيء تم تحميله بالفعل أو شيء جديد، لذلك يتعين عليه تحديد ما إذا كان قد تم تحميله بالفعل أم لا، وإذا لم يكن الأمر كذلك، فإنه يحتاج إلى تحميله. لذلك يجب على dyld أن يفعل نفس الشيء لكل dylib، قد يعتمد كل dylib على شيء تم تحميله بالفعل أو تم تحميله حديثًا، لذلك يتعين عليه تحديد ما إذا كان قد تم تحميله بالفعل أم لا، وإذا لم يكن الأمر كذلك، فإنه يحتاج إلى تحميله.
لذلك، يستمر هذا باستمرار. هذا يستمر.
وفي النهاية تم تحميل كل شيء. في النهاية تم تحميل كل شيء.
الآن، إذا نظرت إلى إحدى العمليات، فإن متوسط العملية في نظامنا، يتم تحميله في أي مكان ما بين 1 إلى 400 ديليبس، لذا فإن هذا عدد كبير من ديليبس ليتم تحميله. الآن، إذا نظرت إلى إحدى العمليات، فإن متوسط العملية في نظامنا، يحتوي على ما بين 1 إلى 400 ديليبس محملة، لذلك هذا عدد كبير من ديليبس ليتم تحميله.
لحسن الحظ، معظم هذه الأشياء عبارة عن dylibs لنظام التشغيل، ونحن نقوم بالكثير من العمل عند إنشاء نظام التشغيل لإجراء حساب مسبق وتخزين مؤقت مسبق للكثير من العمل الذي يتعين على dyld القيام به لتحميل هذه الأشياء. لحسن الحظ، معظمها عبارة عن نظام تشغيل dylibs ونحن نقوم بالكثير من العمل عند إنشاء نظام التشغيل للحساب المسبق والتخزين المؤقت المسبق للكثير من العمل الذي يتطلبه dyld لتحميل هذه الأشياء.
لذلك يتم تحميل OS dylibs بسرعة كبيرة جدًا. لذلك يتم تحميل نظام التشغيل dylibs بسرعة كبيرة جدًا.
لقد قمنا الآن بتحميل كل الدليبس، لكنهم جميعًا يجلسون في عائمتهم بشكل مستقل عن بعضهم البعض، والآن يتعين علينا ربطهم معًا. الآن بعد أن قمنا بتحميل جميع الدليبس، ولكن جميعها في عواماتها الخاصة، نحتاج إلى ربطها معًا.
وهذا ما يسمى الإصلاحات. وهذا ما يسمى يمكن ترتيبه.
ولكن هناك شيء واحد يتعلق بالإصلاحات وهو أننا تعلمنا أنه بسبب توقيع التعليمات البرمجية، لا يمكننا تغيير التعليمات فعليًا. ولكن هناك شيء واحد تعلمناه حول الإصلاح وهو أننا لا نستطيع فعليًا تغيير التعليمات بسبب توقيع التعليمات البرمجية.
إذًا كيف يتصل dylib بdylib آخر إذا لم تتمكن من تغيير تعليمات كيفية الاتصال؟ حسنًا، نعاود الاتصال بصديقنا القديم، ونضيف إليه الكثير من المراوغات القديمة. إذًا، كيف يمكن لـ dylib أن يتصل بـ dylib آخر إذا لم تتمكن من تغيير التعليمات الخاصة بكيفية استدعائه؟ حسنًا، دعنا نتصل بصديق قديم ونلقي عليه الكثير من الكلام غير المباشر.
لذا فإن مولد الكود الخاص بنا يسمى PIC الديناميكي. لذلك يسمى توليد الكود الخاص بنا بالموافقة المسبقة عن علم الديناميكي.
إنه رمز مستقل موضوع، مما يعني أنه يمكن تحميل الكود في العنوان وهو ديناميكي، مما يعني أن الأمور تتم معالجتها بشكل غير مباشر. إنه رمز مستقل عن الموقع، مما يعني أنه يمكن تحميل التعليمات البرمجية في العناوين، وديناميكي، مما يعني أن الأمور تتم معالجتها بشكل غير مباشر.ما يعنيه ذلك هو استدعاء شيء ما إلى شيء آخر، حيث يقوم الجنرال المشترك في الواقع بإنشاء مؤشر في مقطع البيانات ويشير هذا المؤشر إلى ما تريد الاتصال به. هذا يعني أنه للاتصال من شيء إلى آخر، يقوم co-gen فعليًا بإنشاء مؤشر في مقطع البيانات يشير إلى الشيء المطلوب استدعاؤه.
يقوم الكود بتحميل هذا المؤشر وينتقل إليه. يقوم الكود بتحميل هذا المؤشر والانتقال إليه.
لذا فإن كل ما يفعله dyld هو إصلاح المؤشرات والبيانات. إذن ما يفعله dyld هو إصلاح المؤشرات والبيانات.
الآن هناك فئتان رئيسيتان من الإصلاحات، إعادة التأسيس والربط، فما الفرق؟ لذا فإن إعادة التأسيس هي إذا كان لديك مؤشر يشير إلى داخل صورتك، وأي تعديلات مطلوبة لذلك، فإن الخيار الثاني يكون ملزمًا. يوجد الآن نوعان رئيسيان من الإصلاحات، إعادة التأسيس والربط، فما الفرق؟ لذلك، إذا كان لديك مؤشر لصورتك وتحتاج إلى أي تعديلات، فإن الخيار الثاني ملزم.
الربط هو إذا كنت تشير إلى شيء خارج صورتك. الربط هو عندما تشير إلى شيء خارج صورتك.
ويحتاج كل منهم إلى الإصلاح بشكل مختلف، لذلك سأقوم بالخطوات. يتطلب كل منها إصلاحًا مختلفًا، لذا سأغطي الخطوات واحدة تلو الأخرى.
لكن أولاً، إذا كنت فضوليًا، فهناك أمر dyld info مع مجموعة من الخيارات عليه. لكن أولاً، إذا كنت فضوليًا، فهناك أمر dyld info، مع الكثير من الخيارات عليه.
يمكنك تشغيل هذا على أي ثنائي وسترى جميع الإصلاحات التي يجب على dyld القيام بها لهذا الثنائي لإعداده. يمكنك تشغيل هذا على أي ثنائي وسترى جميع التعديلات التي أجراها dyld على هذا الثنائي.
لذا إعادة التأسيس. لذلك إعادة التسعير.
حسنًا، في العصور القديمة، كان بإمكانك تحديد عنوان تحميل مفضل لكل dylb، وكان عنوان التحميل المفضل هذا هو الرابط الثابت وdyld يعملان معًا، بحيث إذا قمت بتحميله، فإنه إلى عنوان التحميل المفضل هذا، وجميع المؤشرات والبيانات التي كان من المفترض أن يتم ترميزها داخليًا، كانت صحيحة ولن يتعين على dyld إجراء أي إصلاحات. في سن الشيخوخة، يمكنك تحديد عنوان التحميل ذي الأولوية لكل dylb، وعنوان التحميل ذو الأولوية هو الرابط الثابت و dyld يعملان معًا، إذا قمت بالتحميل، فإن عنوان التحميل ذو الأولوية، يجب أن تكون جميع المؤشرات والبيانات في الكود الداخلي، وأن تكون صحيحة ولا يتعين على dyld القيام بأي شيء لترتيبها.
ولكن في هذه الأيام، مع ASLR، يتم تحميل dylib الخاص بك إلى عنوان عشوائي. ولكن الآن، مع ASLR، يتم تحميل dylib الخاص بك إلى عنوان عشوائي.
لقد تم تمريره إلى عنوان آخر، مما يعني أن كل تلك المؤشرات والبيانات لا تزال تشير الآن إلى العنوان القديم. لقد انزلق إلى عنوان آخر، مما يعني أن كل تلك المؤشرات والبيانات لا تزال تشير الآن إلى العنوان القديم.
لذا، من أجل إصلاح هذه الأمور، نحتاج إلى حساب الشريحة، وهي مقدار حركتها، ولكل من هذه المؤشرات الداخلية، لإضافة قيمة الشريحة إليها بشكل أساسي. لحل هذه المسائل، نحتاج إلى حساب شريط التمرير، أي مقدار تحركه، ولكل مؤشر داخلي، نحتاج إلى إضافة قيمة شريط التمرير إليهم.
لذا فإن إعادة التأسيس تعني المرور عبر جميع مؤشرات البيانات الداخلية، وإضافة شريحة إليها بشكل أساسي. لذا فإن النقل يعني تكرار جميع مؤشرات البيانات، وهي داخلية، وإضافة شريحة إليها بشكل أساسي.
لذا فإن المفهوم بسيط جدًا، اقرأ، أضف، اكتب، اقرأ، أضف، اكتب. المفهوم بسيط، اقرأ، أضف، اكتب، اقرأ، أضف، اكتب.
ولكن أين هي مؤشرات البيانات تلك؟ حيثما تكون تلك المؤشرات في الجزء الخاص بك، يتم ترميزها في مقطع LINKEDIT. ولكن أين هي مؤشرات البيانات تلك؟ هذه المؤشرات موجودة في الجزء الخاص بك، مشفرة في مقطع LINKEDIT.
الآن، في هذه المرحلة، كل ما لدينا هو كل شيء تم تعيينه، لذلك عندما نبدأ في إعادة التأسيس، فإننا في الواقع نسبب أخطاء في الصفحة في جميع صفحات البيانات. الآن، في هذه المرحلة، ما لدينا هو أن كل شيء تم تعيينه له، لذلك عندما نبدأ في إعادة التأسيس، فإننا في الواقع نتسبب في أخطاء الصفحات في جميع صفحات البيانات.
ومن ثم نقوم بالنسخ والكتابة بينما نقوم بتغييرها. عندما نغيرها، تحدث النسخ والكتابة.
لذلك يمكن أن تكون عملية إعادة التأسيس باهظة الثمن في بعض الأحيان بسبب كل عمليات iO. لذلك قد يكون النقل مكلفًا في بعض الأحيان بسبب أنظمة التشغيل iO.
لكن إحدى الحيل التي نقوم بها هي أننا نقوم بذلك بشكل تسلسلي ومن وجهة نظر النواة، فإنها ترى أن أخطاء البيانات تحدث بشكل تسلسلي. لكن إحدى الحيل التي سنفعلها هي القيام بذلك بشكل تسلسلي، لذلك من منظور النواة، سترى أخطاء البيانات تحدث بشكل تسلسلي.
وعندما ترى ذلك، فإن النواة تقرأ أمامنا مما يجعل iO أقل تكلفة. عندما ترى ذلك، تقرأ النواة البيانات لنا مسبقًا، مما يقلل من تكلفة أجهزة iO.
إذن التالي هو الربط، والربط مخصص للمؤشرات التي تشير إلى خارج dylib. التالي هو الربط، وهو مؤشر إلى خارج dylib.
إنها في الواقع مرتبطة بالاسم، وهي في الواقع عبارة عن سلسلة، في هذه الحالة، malloc المخزنة في تحرير الرابط، والتي تقول أن مؤشر البيانات هذا يحتاج إلى الإشارة إلى malloc. إنها في الواقع مرتبطة بالاسم، وهي في الواقع عبارة عن سلاسل، وفي هذا المثال، يتم تخزين malloc في تحرير الارتباط، مما يشير إلى أن مؤشر البيانات هذا يحتاج إلى الإشارة إلى malloc.
لذا، في وقت التشغيل، يحتاج dyld إلى العثور فعليًا على تنفيذ هذا الرمز، الأمر الذي يتطلب الكثير من العمليات الحسابية، من خلال البحث في جداول الرموز. لذا، في وقت التشغيل، يحتاج dyld إلى العثور فعليًا على تنفيذ هذا الرمز، وهو أمر مكثف حسابيًا ويتطلب النظر إلى جدول الرموز.
بمجرد العثور عليها، يتم تخزين تلك القيم في مؤشر البيانات هذا. وبمجرد العثور عليها، يتم تخزين هذه القيمة في مؤشر البيانات هذا.
لذا فهذه طريقة أكثر تعقيدًا من الناحية الحسابية من عملية إعادة التأسيس. لذا فالأمر أكثر تعقيدًا من إعادة الاستهداف.
ولكن هناك القليل جدًا من iO لأن إعادة التأسيس قد قامت بمعظم iO بالفعل. ولكن يوجد عدد قليل جدًا من عمليات iO لأن Chongji قد أكمل بالفعل معظم عمليات iO.
بعد ذلك، يحتوي ObjC على مجموعة من هياكل DATA، وهيكل فئة DATA الذي يعد مؤشرًا لأساليبه ومؤشرًا لللمعان الفائق وما إلى ذلك. بعد ذلك، يحتوي ObjC على مجموعة من هياكل البيانات، وهياكل بيانات الفئة هي مؤشرات لأساليبها ومؤشرات فائقة اللمعان وما إلى ذلك.يتم إصلاح كل هذه الأشياء تقريبًا عن طريق إعادة التأسيس أو الربط. يتم إصلاح كل هذه الأشياء تقريبًا عن طريق إعادة التأسيس أو الربط.
ولكن هناك بعض الأشياء الإضافية التي يتطلبها وقت تشغيل ObjC. لكن وقت تشغيل ObjC يتطلب شيئًا إضافيًا.
الأول هو أن ObjC هي لغة ديناميكية ويمكنك طلب إثبات الفصل بالاسم. الأول هو أن ObjC هي لغة ديناميكية ويمكنك طلب تأكيد الفصل بالاسم.
وهذا يعني أن وقت تشغيل ObjC يجب أن يحتفظ بجدول بجميع أسماء الفئة التي يتم تعيينها إليها. هذا يعني أن وقت تشغيل ObjC يجب أن يحتفظ بجدول يحتوي على كافة أسماء الفئات التي تم تعيينها لها.
لذلك في كل مرة تقوم فيها بتحميل شيء ما، فإنه يحدد فئة، ويجب تسجيل اسمه في جدول عالمي. لذلك في كل مرة يتم تحميل شيء ما، فإنه يحدد فئة ويجب تسجيل اسمه في جدول عالمي.
بعد ذلك، ربما تكون قد سمعت في لغة C++ عن مشكلة ivar الهشة، آسف. بعد ذلك، في لغة C++، ربما تكون قد سمعت عن مشكلة ivar الهشة، آسف.
مشكلة الطبقة الأساسية الهشة. قضية الطبقة الأساسية الهشة.
ليس لدينا هذه المشكلة مع ObjC لأن أحد الإصلاحات التي نقوم بها هو تغيير إزاحات جميع ivars ديناميكيًا، في وقت التحميل. لا يواجه ObjC هذه المشكلة لأن الإصلاح الذي أجريناه كان تغيير إزاحات جميع ivars عند التحميل ديناميكيًا.
بعد ذلك، في ObjC يمكنك تحديد الفئات التي تغير أساليب فئة أخرى. بعد ذلك، في ObjC، يمكنك تحديد الفئات التي تغير أساليب فئة أخرى.
في بعض الأحيان تكون هذه العناصر موجودة في فئات غير موجودة في صورتك على dylib آخر، لذا يجب تطبيق إصلاحات الطريقة هذه في هذه المرحلة. في بعض الأحيان لا تكون هذه الفئات موجودة في الصورة على ديليب آخر ويجب تطبيق هذه الأساليب في ذلك الوقت.
وأخيرًا، يعتمد ObjC [غير مسموع] على كون المحددات فريدة لذلك نحتاج إلى محددات فريدة. أخيرًا، يعتمد ObjC [غير مسموع] على كون المحددات فريدة لذلك نحتاج إلى محددات فريدة.
والآن بعد أن قمنا بجميع عمليات إصلاح البيانات، يمكننا الآن إجراء جميع عمليات إصلاح البيانات التي يمكن وصفها بشكل ثابت. الآن بعد أن قمنا بجميع تصحيحات البيانات، يمكننا الآن إجراء جميع تصحيحات البيانات التي يمكن وصفها بشكل ثابت.
إذن، هذه هي فرصتنا لإجراء عمليات إصلاح البيانات الديناميكية. حان الوقت الآن لإجراء إصلاح البيانات الديناميكية.
لذلك في C++، يمكن أن يكون لديك مُهيئ، يمكنك أن تقول [غير مسموع] يساوي أي تعبير تريده. في C++، يمكن أن يكون لديك مُهيئ ويمكنك أن تقول [غير مسموع] يساوي أي تعبير تريده.
يجب تشغيل هذا التعبير التعسفي في هذا الوقت ويتم تشغيله في هذه المرحلة الآن. تم تشغيل هذا التعبير التعسفي، الذي يحتاج الآن إلى التشغيل.
لذلك يقوم مترجم C++ بإنشاء مُهيئات لتهيئة البيانات التعسفية هذه. يقوم برنامج التحويل البرمجي C++ بإنشاء مُهيئات لعمليات تهيئة البيانات التعسفية هذه.
في ObjC، هناك شيء يسمى طريقة +load. في ObjC، هناك طريقة تسمى +load.
الآن تم إهمال طريقة +load، ونوصي بعدم استخدامها. لقد تم الآن إهمال طريقة +load ونوصي بعدم استخدامها.
ننصحك باستخدام علامة زائد للتهيئة. نوصي باستخدام +التهيئة.
ولكن إذا كان لديك واحدة، فسيتم تشغيلها في هذه المرحلة. ولكن إذا كان لديك واحد، فإنه يعمل في هذه المرحلة.
إذن، الآن لدي هذا الرسم البياني الكبير، لدينا الجزء العلوي الرئيسي القابل للتنفيذ، وكل الديليبس تعتمد عليه، هذا الرسم البياني الضخم، علينا تشغيل أدوات التهيئة. الآن بعد أن أصبح لدي هذا الرسم البياني الكبير، لدينا ملفك الرئيسي القابل للتنفيذ في الأعلى والذي تعتمد عليه جميع dylibs، هذا الرسم البياني الكبير، علينا تشغيل أداة التهيئة.
بأي ترتيب نريدهم؟ حسنًا، نحن نديرهم من الأسفل إلى الأعلى. وبأي ترتيب نريد ترتيبهم؟ دعونا نعد من الأسفل إلى الأعلى.
والسبب هو أنه عند تشغيل التهيئة، قد تحتاج إلى استدعاء بعض dylib وتريد التأكد من أن dylibs جاهز بالفعل للاستدعاء. والسبب هو أنه عند تشغيل init، قد يحتاج إلى استدعاء بعض dylibs، وتحتاج إلى التأكد من أن dylibs جاهزة للاستدعاء.
لذلك، من خلال تشغيل أدوات التهيئة من الأسفل إلى أعلى فئة التطبيق، يمكنك الاتصال بأمان بشيء تعتمد عليه. لذلك، من خلال تشغيل أداة التهيئة من الأسفل إلى الأعلى، يمكنك الاتصال بالأشياء التي تعتمد عليها بأمان.
لذا، بمجرد الانتهاء من جميع عمليات التهيئة، يمكننا الآن في النهاية استدعاء برنامج dyld الرئيسي. بمجرد اكتمال جميع إجراءات التهيئة، يمكننا الآن أخيرًا استدعاء برنامج dyld الرئيسي
إذن لقد نجوتم من هذا الجزء النظري، أنتم الآن جميعًا خبراء في كيفية بدء العمليات، وتعلمون الآن أن dyld هو برنامج مساعد، فهو يقوم بتحميل جميع المكتبات التابعة، ويصلح جميع صفحات البيانات، ويشغل المهيئات ثم ينتقل إلى الرئيسي. لقد انتهيت من هذا الجزء النظري، وأصبحتم الآن خبراء في كيفية بدء العمليات، وتعلمون الآن أن dyld هو برنامج مساعد يقوم بتحميل جميع المكتبات التابعة، ويصلح جميع صفحات البيانات، ويشغل المُهيئ، ثم ينتقل إلى الرئيسي.
والآن، لوضع كل هذه النظرية التي تعلمت استخدامها، أود أن أسلمها إلى لويس، الذي سيقدم لك بعض النصائح العملية. الآن، لوضع النظرية التي تعلمتها موضع التنفيذ، أود أن أسلمها إلى لويس، الذي سيقدم لك بعض النصائح العملية.
شكرا نيك. شكرا لك، نيك.
لقد مررنا جميعًا بتلك التجربة حيث نخرج هاتفنا من جيوبنا، ونضغط على زر الصفحة الرئيسية، ثم نضغط على التطبيق الذي نريد تشغيله. لقد مررنا جميعًا بذلك: نخرج هواتفنا من جيوبنا، ونضغط على زر الصفحة الرئيسية، ثم نضغط على التطبيق الذي نريد تشغيله.
ثم اضغط ثم اضغط ثم اضغط مرة أخرى على بعض الأزرار لأنه لا يستجيب. ثم انقر، ثم انقر، ثم انقر فوق بعض الأزرار مرة أخرى لأنه لا يستجيب.
عندما يحدث ذلك لي، يكون الأمر محبطًا للغاية، وأريد حذف التطبيق. عندما يحدث هذا لي أشعر بالإحباط الشديد وأريد حذف التطبيق.
أنا لويس جيربارج وأعمل في dyld واليوم، سنناقش كيفية تشغيل تطبيقك على الفور، حتى يشعر المستخدمون بالسعادة. أنا لويس جيربارج، وأعمل في dyld، وسنتحدث اليوم عن كيفية تشغيل تطبيقك على الفور حتى يشعر المستخدمون بالسعادة.لذا، أولاً، دعونا نناقش ما سنتناوله في هذا الجزء من الحديث. أولا، دعونا نناقش هذا الجزء.
سنناقش مدى السرعة التي تحتاجها فعليًا لبدء التشغيل حتى يتمتع المستخدمون بتجربة جيدة. سنناقش مدى السرعة التي تحتاجها فعليًا لمنح المستخدمين تجربة جيدة.
كيفية قياس وقت الإطلاق. كيفية قياس وقت الإطلاق.
لأنه يمكن أن يكون صعبا للغاية. لأنه من الصعب جدا.
لا تنطبق الطرق القياسية التي تقيس بها تطبيقك قبل تشغيل التعليمات البرمجية الخاصة بك. وإلى أن يتم تشغيل التعليمات البرمجية، لا يتم تطبيق الطرق القياسية لقياس التطبيق.
سنقوم بمراجعة قائمة بالأسباب الشائعة التي تجعل الكود الخاص بك، أو آسف، سنستعرض قائمة بالأسباب الشائعة التي تجعل عملية الإطلاق بطيئة. سنقوم بإدراج بعض الأسباب الشائعة لتوضيح سبب بدء تشغيل التعليمات البرمجية ببطء. عذرًا، سنقوم بإدراج بعض الأسباب الشائعة لتوضيح سبب بدء تشغيل التعليمات البرمجية ببطء.
وأخيرًا، سنستعرض طريقة لإصلاح جميع حالات التباطؤ. وأخيرا ما نريد أن نتحدث عنه هو الحل لجميع مشاكل البطء.
لذلك سأعطيكم القليل من المعلومات لبقية محادثتي. لذلك، في بقية خطابي، سأخبركم بحلقة صغيرة.
عليك أن تفعل أشياء أقل [ضحك]. عليك أن تفعل أقل [ضحك].
الآن، لا أقصد أن تطبيقك يجب أن يحتوي على ميزات أقل، بل أقول أن تطبيقك يجب أن يقوم بأشياء أقل قبل تشغيله. الآن، أنا لا أقول أن تطبيقك يجب أن يحتوي على ميزات أقل، بل أقول إن تطبيقك يجب أن يقوم بأشياء أقل قبل أن يتمكن من التشغيل.
نريدك أن تكتشف كيفية تأجيل بعض سلوكيات الإطلاق الخاصة بك لتهيئتها قبل التنفيذ مباشرةً. نأمل أن تتمكن من معرفة كيفية تأخير بعض سلوكيات بدء التشغيل حتى تتم تهيئتها قبل التنفيذ.
لذلك، دعونا نناقش الأهداف، ومدى السرعة التي نريد إطلاقها. لذا، دعونا نتحدث عن الأهداف، ومدى السرعة التي نريد إطلاقها.
حسنًا، يختلف وقت الإطلاق بين المنصات المختلفة. يختلف وقت بدء التشغيل باختلاف الأنظمة الأساسية.
ولكن، القاعدة الأساسية الجيدة هي أن 400 مللي ثانية هي وقت إطلاق جيد. ومع ذلك، فإن القاعدة الأساسية الجيدة هي أن 400 مللي ثانية هي وقت بدء تشغيل جيد.
الآن، السبب في ذلك هو أننا قمنا بتشغيل الرسوم المتحركة على الهاتف لإعطاء إحساس بالاستمرارية بين الشاشة الرئيسية وتطبيقك، عندما تراه قيد التنفيذ. والسبب في ذلك هو أننا بدأنا الرسوم المتحركة على الهاتف لمنحهم إحساسًا بالاستمرارية عندما ترى الشاشة الرئيسية وتطبيقاتك قيد التنفيذ.
وتستغرق هذه الرسوم المتحركة وقتًا، وتمنحك هذه الرسوم المتحركة فرصة لإخفاء أوقات الإطلاق. تستغرق هذه الرسوم المتحركة وقتًا، وتمنحك هذه الرسوم المتحركة الفرصة لإخفاء وقت بدء التشغيل.
من الواضح أن هذا قد يكون مختلفًا، في سياق مختلف، تعد ملحقات تطبيقك أيضًا تطبيقات يجب تشغيلها، ويتم تشغيلها في فترات زمنية مختلفة. من الواضح أن هذا قد يكون مختلفًا، ففي ظروف مختلفة تكون امتدادات تطبيقك هي أيضًا التطبيقات التي يجب تشغيلها، ويتم تشغيلها في أوقات مختلفة.
والهاتف والتلفزيون والساعة أشياء مختلفة، لكن 400 مللي ثانية هي هدف جيد. الهواتف المحمولة وأجهزة التلفاز والساعات هي أشياء مختلفة، ولكن 400 مللي ثانية هي هدف جيد.
لا يمكنك أبدًا أن تستغرق أكثر من 20 ثانية للإطلاق. لا يمكن أن يتجاوز وقت الإطلاق 20 ثانية.
إذا استغرقت أكثر من 20 ثانية، فسيقوم نظام التشغيل بإيقاف تطبيقك، على افتراض أنه يمر عبر حلقة لا نهائية، وقد مررنا جميعًا بهذه التجربة. إذا استغرقت أكثر من 20 ثانية، فسيقوم النظام بقتل تطبيقك، على افتراض أنه يمر عبر حلقة لا نهائية، لقد كنا جميعًا هناك.
عندما تنقر على أحد التطبيقات، يظهر على الشاشة الرئيسية، ولا يستجيب، ثم يختفي، وهذا عادة ما يحدث هنا. عندما تنقر على أحد التطبيقات، فإنه يظهر على الشاشة الرئيسية، ويصبح غير مستجيب، ثم يختفي، وهو ما يحدث عادةً هنا.
وأخيرًا، من المهم جدًا إجراء الاختبار على أبطأ جهاز مدعوم لديك. وأخيرًا، من المهم إجراء الاختبار على أبطأ جهاز مدعوم.
لذا فإن هذه المؤقتات هي قيم ثابتة عبر جميع الأجهزة المدعومة على منصاتنا. لذا فإن هذه الموقتات ثابتة لجميع الأجهزة المدعومة على نظامنا الأساسي.
لذلك، إذا وصلت إلى 400 مللي ثانية على جهاز iPhone 6S الذي تستخدمه للاختبار الآن، فمن المحتمل أنك بالكاد تصل إليه، وربما لن تصل إليه على iPhone 5. لذا، إذا نقرت لمدة 400 مللي ثانية على جهاز iPhone 6S الذي تختبره، فقد تضغط عليه فقط، وقد لا تنقر عليه على جهاز iPhone 5.
لذلك دعونا نلخص جزء نيك من الحديث. دعونا نراجع خطاب نيك.
ماذا علينا أن نفعل لبدء التشغيل، علينا تحليل الصور، وتعيين الصور، وإعادة صياغة الصور، وربط الصور، وتشغيل مُهيئات الصور، ثم استدعاء main. ما يتعين علينا القيام به للبدء، نحتاج إلى تحليل الصورة، وتعيين الصورة، وإعادة تعيين الصورة، وربط الصورة، وتشغيل تهيئة الصورة، ثم الاتصال بالرئيسي.
إذا كان هذا يبدو كثيرًا، فهو كذلك، فأنا مرهق من مجرد قول ذلك. إذا كان هذا يبدو كثيرًا، فهو كذلك، وأنا مرهق من مجرد قول ذلك.
وبعد ذلك، يتعين علينا الاتصال بـ UIApplicationMain، وسترى أنه يتم التعامل مع ذلك ضمنيًا في تطبيقات ObjC أو في تطبيقات Swift. بعد ذلك، نحتاج إلى استدعاء UIApplicationMain، والذي ستراه يتم التعامل معه ضمنيًا في تطبيق ObjC أو تطبيق Swift.
يؤدي ذلك إلى القيام ببعض الأشياء الأخرى، بما في ذلك تشغيل مُهيئات إطار العمل وتحميل حبيباتك. ويمكنه أيضًا القيام ببعض الأشياء الأخرى، بما في ذلك تشغيل مُهيئات إطار العمل وتحميل المناقير.
وفي النهاية ستتلقى مكالمة هاتفية من مندوب التطبيق الخاص بك. وأخيرًا، ستتلقى رد اتصال في مندوب التطبيق.
أنا أذكر هذين الأخيرين لأنه تم حسابهما في تلك الـ 400 مللي ثانية التي ذكرتها للتو. أذكر الأخيرين لأنه تم حسابهما باستخدام الـ 400 مللي ثانية التي ذكرتها للتو.
لكننا لن نناقشها في هذا الحديث. لكننا لن نناقشهم في هذا الحديث.إذا كنت تريد رؤية أفضل لما يحدث هناك، فهناك حديث من عام 2012، حول استجابة أداء تطبيقات iOS. إذا كنت ترغب في فهم ما يحدث هناك بشكل أفضل، فهناك حديث عام 2012 بعنوان استجابة أداء تطبيقات iOS.
أنصحك بشدة بالعودة ومشاهدة الفيديو. أنصحك بشدة بالعودة ومشاهدة الفيديو.
لكن هذا هو آخر ما سنتحدث عنه الآن. لكن هذا هو آخر ما سنتحدث عنه الآن.
لذلك، دعونا ننتقل إلى شيء آخر أريد التحدث عنه، الإطلاق الدافئ مقابل الإطلاق البارد. لذلك، دعونا ننتقل إلى الشيء الآخر الذي أريد أن أقوله، الانبعاث الساخن والانبعاث البارد.
لذا، عندما تقوم بتشغيل تطبيق ما، فإننا نتحدث عن عمليات الإطلاق الدافئة والباردة. عند بدء تطبيق ما، نناقش البداية الدافئة والبداية الباردة.
والتشغيل الدافئ هو تطبيق حيث يكون التطبيق موجودًا بالفعل في الذاكرة، إما لأنه تم تشغيله وإنهاءه مسبقًا، ولا يزال موجودًا في القرص المضغوط في النواة، أو لأنك قمت بنسخه للتو. في حين أن التمهيد الدافئ يكون عندما يكون التطبيق موجودًا بالفعل في الذاكرة لأنه تم تشغيله وخروجه من قبل، أو أنه لا يزال موجودًا في قرص kernel، أو لأنك قمت بنسخه للتو.
الإطلاق البارد هو إطلاق في مكان غير موجود في القرص. التمهيد البارد هو تمهيد غير موجود على القرص.
وبشكل عام، يعد الإطلاق البارد هو الأكثر أهمية للقياس. غالبًا ما يكون الانبعاث البارد هو القياس الأكثر أهمية.
السبب وراء أهمية قياس التشغيل البارد هو أنه عندما يقوم المستخدم بتشغيل التطبيق بعد إعادة تشغيل الهاتف، أو للمرة الأولى منذ فترة طويلة، فهذا هو الوقت الذي تريده حقًا أن يكون فوريًا. السبب الأكثر أهمية للبداية الباردة هو أنه عندما يقوم المستخدم بتشغيل التطبيق بعد إعادة تشغيل الهاتف، أو لأول مرة منذ فترة طويلة، فأنت تريد حقًا أن يكون التطبيق فوريًا.
من أجل قياس تلك، تحتاج حقًا إلى إعادة التشغيل بين القياسات. من أجل قياس هذه، تحتاج إلى إعادة التشغيل بين القياسات.
ومع ذلك، إذا كنت تعمل على تحسين عمليات الإطلاق الدافئة، فسوف تميل عمليات الإطلاق الباردة إلى التحسن أيضًا. ومع ذلك، إذا كنت تعمل على تحسين البدايات الدافئة، فسوف تتحسن البدايات الباردة أيضًا.
يمكنك القيام بدورات تطوير سريعة عند الإطلاق الدافئ، ولكن بعد ذلك، قم باختبار الإطلاق البارد بين الحين والآخر. يمكنك تشغيل دورات تطوير سريعة في بدايات دافئة، لكن أحيانًا تستخدم بدايات باردة للاختبار.
إذًا، كيف نقيس الوقت قبل الرئيسي؟ حسنًا، لدينا نظام قياس مدمج في dyld، يمكنك الوصول إليه من خلال ضبط متغير البيئة. إذًا، كيف نقيس الوقت قبل الرئيسي؟ لدينا نظام قياس مدمج في dyld، والذي يمكنك الوصول إليه عن طريق تعيين متغير البيئة.
إحصائيات الطباعة DYLD. DYLD يطبع البيانات.
لقد كان متوفرًا في أنظمة تشغيل الشحن في الواقع، ولكنه يطبع الكثير من معلومات تصحيح الأخطاء الداخلية التي ليست مفيدة بشكل خاص، كما أنها تفتقد بعض المعلومات التي ربما تريدها. إنها في الواقع متوفرة بالفعل في أنظمة التشغيل التي تم إصدارها، ولكنها تطبع الكثير من معلومات تصحيح الأخطاء الداخلية التي لا تكون مفيدة بشكل خاص، وتفقد بعض المعلومات التي قد تحتاجها.
ونحن نصلح ذلك اليوم. نحن نتناول هذه القضية اليوم.
لذلك تم تحسينه بشكل ملحوظ في أنظمة التشغيل الجديدة. لذلك تم تحسينه بشكل ملحوظ على نظام التشغيل الجديد.
سيوفر لك الكثير من المعلومات ذات الصلة والتي من شأنها أن تمنحك طرقًا قابلة للتنفيذ لتحسين أوقات الإطلاق. سيزودك بالمزيد من المعلومات ذات الصلة التي ستمنحك طرقًا قابلة للتنفيذ لتحسين وقت النشر.
وسيكون متاحًا في البذور 2. سيكون متاحًا في البذور 2.
لذلك، هناك شيء آخر أريد التحدث عنه في هذا، وهو أن مصحح الأخطاء يجب أن يتوقف مؤقتًا عن التشغيل عند كل تحميل dylib من أجل تحليل الرموز من تطبيقك وتحميل نقاط التوقف، عبر كابل USB الذي يمكن أن يستغرق وقتًا طويلاً للغاية. لذلك، شيء آخر أود قوله هو أن مصحح الأخطاء يجب أن يوقف بدء التشغيل مؤقتًا في كل مرة يتم فيها تحميل dylib من أجل حل الرموز في التطبيق وتحميل نقاط التوقف عبر كابل USB، الأمر الذي قد يستغرق وقتًا طويلاً للغاية.
لكن dyld يعرف ذلك ويقوم بطرح مهلة مصحح الأخطاء من الأرقام التي يسجلها. لكن dyld يعرف ذلك ويقوم بطرح وقت مصحح الأخطاء من الرقم المسجل.
لذلك لا داعي للقلق بشأن ذلك، لكنك تلاحظ ذلك لأن dyld سيعطيك أرقامًا أصغر بكثير مما ستلاحظه من خلال النظر إلى الساعة المعلقة على الحائط. لذلك لا داعي للقلق بشأن ذلك، ولكنك ستلاحظ ذلك لأن dyld سيعطيك رقمًا أصغر بكثير مما قد تراه إذا نظرت إلى الساعة المعلقة على الحائط.
هذا أمر متوقع ومفهوم، وكل شيء يسير بشكل صحيح إذا رأيت ذلك، ولكني أردت فقط أن أشير إليه. وهذا أمر متوقع ومفهوم، وإذا رأيته فكله طبيعي، ولكن أردت فقط أن أكتبه.
لذلك دعونا ننتقل إلى تعيين متغير بيئة في Xcode، ما عليك سوى الانتقال إلى محرر المخطط، وإضافته بهذه الطريقة. دعنا نمضي قدمًا ونقوم بتعيين متغير بيئة في Xcode، ما عليك سوى الانتقال إلى محرر المخطط وإضافته بهذه الطريقة.
بمجرد القيام بذلك، ستحصل على سجل وحدة التحكم الجديد في الإخراج، ويتم تسجيل إخراج وحدة التحكم. بمجرد القيام بذلك، سوف تحصل على سجل إخراج وحدة التحكم الجديد لإخراج سجل إخراج وحدة التحكم.
وكيف يبدو ذلك؟ حسنًا، هذا ما يبدو عليه الناتج، ولدينا شريط زمني في الأسفل يمثل الأجزاء المختلفة منه. كيف يبدو ذلك؟ هذا هو الشكل الذي يبدو عليه الناتج، مع وجود شريط زمني في الأسفل لتمثيل الأجزاء المختلفة منه.
ودعونا نضيف شيئا آخر. دعونا نضيف شيئا آخر.
دعونا نضيف مؤشرًا لهدف الـ 400 مللي ثانية، والذي لم يصل إليه هذا التطبيق الذي أعمل عليه. دعونا نضيف مؤشرًا لهدف الـ 400 مللي ثانية، والذي لم يتم الوصول إليه باستخدام هذا التطبيق الذي أستخدمه.
لذا، إذا نظرت إلى الأمر، فهذا هو الترتيب الأساسي للخطوات التي ناقشها Nick من أجل تشغيل التطبيق، لذلك دعونا نستعرضها بالترتيب. إذا نظرت إلى هذا، فهذه هي الخطوات الأساسية التي ناقشها نيك حول تشغيل التطبيق. دعونا ننظر إليها بالترتيب.لذا، فإن الشيء الكبير الذي يجب فهمه حول تحميل dylib والتباطؤ الذي ستلاحظه منه، هو أن dylibs المضمنة يمكن أن تكون باهظة الثمن. لذا فإن تحميل dylib، وهو أمر مهم في فهم تحميل dylib، والتباطؤ الذي ستشاهده، هو أن dylibs المضمنة يمكن أن تكون باهظة الثمن.
لذلك قال نيك إن متوسط التطبيق يمكن أن يصل إلى 100 إلى 400 ديليبس. قال نيك إن التطبيق يمكن أن يحتوي على ما بين 100 إلى 400 ديليبس في المتوسط.
لكن نظام التشغيل dylibs سريع لأنه عندما نبني نظام التشغيل، لدينا طرق لحساب الكثير من تلك البيانات مسبقًا. لكن dylibs نظام التشغيل سريع لأنه عندما نبني نظام تشغيل، لدينا طرق لحساب كميات كبيرة من البيانات مسبقًا.
ولكن ليس لدينا كل dylib في كل تطبيق عندما نقوم ببناء نظام التشغيل. ولكن عند إنشاء نظام تشغيل، لا يحتوي كل تطبيق على dylibs.
لا يمكننا حسابها مسبقًا من أجل dylibs التي تقوم بتضمينها في تطبيقك، لذلك يتعين علينا أن نمر بعملية أبطأ بكثير بينما نقوم بتحميلها. لا يمكننا حسابها مسبقًا من أجل dylibs المضمنة في التطبيق، لذلك عند تحميلها علينا أن نمر بعملية أبطأ بكثير.
والحل لهذا هو أننا نحتاج فقط إلى استخدام عدد أقل من الديليبس وهذا يمكن أن يكون صعبًا. الحل لهذه المشكلة هو أننا نحتاج فقط إلى استخدام كميات أقل من الديليبس، والتي يمكن أن تكون خامًا.
وأنا لا أقول أنه لا يمكنك استخدام أي منها، ولكن هناك خياران هنا يمكنك من خلالهما دمج dylibs الموجودة. أنا لا أقول أنه لا يمكنك استخدام أي منها، ولكن هناك خياران يمكنك استخدامهما لدمج dylibs الموجودة.
يمكنك استخدام الأرشيفات الثابتة وربطها بكليهما في التطبيقات بهذه الطريقة. يمكنك استخدام الأرشيفات الثابتة وربطها في كلا التطبيقين.
ولديك خيار التحميل البطيء، وهو استخدام dlopen، لكن dlopen يسبب بعض المشكلات الدقيقة في الأداء والصحة، ويؤدي في الواقع إلى القيام بالمزيد من العمل لاحقًا، ولكن يتم تأجيله. يمكنك اختيار التحميل البطيء، حتى باستخدام dlopen، ولكن dlopen يسبب بعض المشكلات الدقيقة في الأداء والصحة، فهو يتسبب في الواقع في إنجاز المزيد من العمل لاحقًا، ولكنه يتأخر.
لذا، فهو خيار قابل للتطبيق ولكن يجب أن تفكر فيه طويلًا وصعبًا، وسأثبطه إذا كان ذلك ممكنًا. لذا، فهو خيار قابل للتطبيق، لكن يجب أن تفكر فيه وسأثنيك عنه إن أمكن.
لذلك، لدي تطبيق هنا يحتوي حاليًا على 26 ديليبس، ويستغرق تحميلها 240 مللي ثانية فقط، ولكن إذا قمت بتغييره ودمج تلك الديليبس في اثنين ديليبس، فسيستغرق الأمر 20 مللي ثانية فقط لتحميل الديليبس. لدي تطبيق يحتوي حاليًا على 26 dylibs ويستغرق تحميلها 240 مللي ثانية، ولكن إذا قمت بتغييره ودمج هذه dylibs في اثنين من dylibs، فسيستغرق تحميل هذه dylibs 20 مللي ثانية فقط.
لذلك لا يزال بإمكاني الحصول على dylibs، ولا يزال بإمكاني استخدامها لمشاركة الوظائف بين تطبيقي وامتدادي، ولكن الحد منها سيكون مفيدًا للغاية. لذلك لا يزال بإمكاني استخدام dylibs، ولا يزال بإمكاني استخدامها لمشاركة الوظائف بين تطبيقي وإضافاتي، ومع ذلك، فإن الحد منها سيكون مفيدًا للغاية.
وأنا أتفهم أن هذه هي المقايضة التي تجريها بين راحة التطوير لديك ووقت تشغيل التطبيق الخاص بك للمستخدمين. أدرك أن هذه مقايضة تقوم بها بين سهولة التطوير للمستخدمين ووقت بدء تشغيل التطبيق.
لأنه كلما زاد عدد dylibs لديك، أصبح من الأسهل إنشاء تطبيقك وإعادة ربطه فيه، وكانت دورات التطوير الخاصة بك أسرع. لأنه كلما زاد عدد dylibs، أصبح من الأسهل إنشاء التطبيق وإعادة ربطه، وأصبحت دورة التطوير أسرع.
لذا، يمكنك بالتأكيد، ويجب عليك، استخدام بعضها، ولكن من الجيد محاولة استهداف عدد محدود، وأود أن أقول بشكل غير مباشر، إن الهدف الجيد هو حوالي ستة. لذا، يمكنك بالتأكيد، بل ويجب عليك، استخدام بعضها، لكن من الأفضل استهداف عدد محدود، وأود أن أقول إن الهدف الجيد هو حوالي ستة.
والآن بعد أن قمنا بإصلاح عدد dylib، فلننتقل إلى المكان التالي الذي نواجه فيه تباطؤًا. الآن بعد أن قمنا بحل مشكلة عدد dylib، فلننتقل إلى التباطؤ التالي.
بين 350 مللي ثانية في الربط وإعادة التأسيس. 350 مللي ثانية بين الربط والنقل.
لذلك، كما ذكر نيك، فإن إعادة التأسيس تميل إلى أن تكون أبطأ بسبب iO والربط يميل إلى أن يكون مكلفًا من الناحية الحسابية ولكنه قد تم بالفعل تنفيذ iO. كما ذكر نيك، ستكون عملية إعادة التأسيس أبطأ بسبب iO وستكون التكلفة الحسابية للربط أعلى ولكن يتم ذلك باستخدام iO.
لذا فإن iO مخصص لكليهما وهما مختلطان، والتوقيت مختلط أيضًا. فكان iO لكليهما، جاءا وجاء الوقت.
لذا، إذا دخلنا ونظرنا إلى ذلك، فسنجد أن كل ذلك هو إصلاح المؤشرات في قسم البيانات. إذا دخلنا ونظرنا إليها، فكل هذه مؤشرات إلى قسم البيانات الثابتة.
إذن ما يتعين علينا القيام به هو إصلاح عدد أقل من المؤشرات. إذن ما يتعين علينا القيام به هو إصلاح عدد أقل من المؤشرات.
أظهر لك Nick أداة يمكنك تشغيلها لمعرفة المؤشرات التي يتم إصلاحها في قسم البيانات ومعلومات dyld. يعرض لك Nick أداة يمكنك تشغيلها لمعرفة المؤشرات التي يتم إصلاحها في البيانات والقسم ومعلومات dyld.
ويوضح الأجزاء والأقسام التي تحتوي عليها الأشياء، مما سيعطيك فكرة جيدة عما يتم إصلاحه. فهو يعرض أجزاء وأجزاء من الأشياء، مما يمنحك فكرة جيدة عما يتم استعادته.
على سبيل المثال، إذا رأيت رمزًا لفئة ObjC في قسم ObjC، فمن المحتمل أن يكون لديك مجموعة من فئات ObjC. على سبيل المثال، إذا رأيت رموزًا لفئات ObjC في قسم ObjC، فمن المحتمل أن يكون لديك مجموعة من فئات ObjC.
لذلك، أحد الأشياء التي يمكنك القيام بها هو أنه يمكنك فقط تقليل عدد كائنات فئات ObjC وivars الموجودة لديك. شيء واحد يمكنك القيام به هو تقليل عدد كائنات فئة ObjC و ivars لديك.
لذلك هناك عدد من أنماط البرمجة التي تشجع الفصول الصغيرة جدًا، والتي ربما تحتوي على وظيفة واحدة أو وظيفتين فقط. لذلك، هناك العديد من أنماط البرمجة التي تشجع الفئات الصغيرة جدًا، والتي قد تحتوي على وظيفة واحدة أو وظيفتين فقط.وقد تؤدي هذه الأنماط المعينة إلى تباطؤ تدريجي لتطبيقاتك عند إضافة المزيد والمزيد منها. وكلما قمت بإضافة المزيد والمزيد من التطبيقات، يمكن أن تتسبب هذه الأنماط المحددة في إبطاء تطبيقاتك تدريجيًا.
لذلك يجب أن تكون حذرا بشأن هؤلاء. لذلك يجب أن تكون حذرا مع هؤلاء.
الآن، لا يمثل وجود 100 أو 1000 فصل مشكلة، لكننا رأينا تطبيقات تحتوي على 5، 10، 15، 20000 فصل. الآن، لا يعد وجود 100 أو 1000 فصل مشكلة، لكننا رأينا تطبيقات تحتوي على 5، 10، 15، 20 ألف فصل.
وفي تلك الحالات يمكن أن يضيف ما يصل إلى 7 أو 800 مللي ثانية إلى وقت الإطلاق حتى تتمكن النواة من ترحيلها. في هذه الحالات، سيزيد وقت التمهيد للنواة لترحيلها بمقدار 7 أو 800 مللي ثانية.
شيء آخر يمكنك القيام به هو محاولة تقليل استخدامك لوظائف C++ الافتراضية. شيء آخر يمكنك القيام به هو تقليل استخدامك لوظائف C++ الافتراضية.
لذلك تقوم الوظائف الافتراضية بإنشاء ما نسميه جداول V، وهي نفس بيانات تعريف ObjC بمعنى أنها تنشئ هياكل في قسم البيانات التي يجب إصلاحها. لذلك تقوم الوظائف الافتراضية بإنشاء ما نسميه جداول V، وهي نفس بيانات تعريف ObjC لأنها تنشئ هياكل في جزء البيانات التي تحتاج إلى إصلاح.
إنها أصغر من ObjC، وهي أصغر من بيانات تعريف ObjC ولكنها لا تزال مهمة لبعض التطبيقات. إنها أصغر من ObjC وأصغر من بيانات تعريف ObjC ولكنها لا تزال مهمة لبعض التطبيقات.
يمكنك استخدام بنيات Swift. يمكن استخدام الهياكل السريعة.
لذا يميل Swift إلى استخدام بيانات أقل تحتوي على مؤشرات لإصلاحات من هذا النوع. ولذلك، يميل Swift إلى استخدام بيانات أقل تحتوي على مؤشرات لمثل هذه الإصلاحات.
كما أن Swift أكثر قابلية للتنفيذ ويمكنها أن تكون مشتركة بشكل أفضل لتجنب الكثير من ذلك، لذا فإن الانتقال إلى Swift يعد طريقة رائعة لتحسين ذلك. كما أن لغة Swift أسهل في التضمين وتعمل بشكل أفضل معًا لتجنب ذلك، لذا فإن الانتقال إلى لغة Swift يعد طريقة رائعة للتحسين.
وشيء آخر، يجب أن تكون حذرًا بشأن الرموز التي يتم إنشاؤها بواسطة الآلة، لذلك لدينا حالات يمكنك فيها وصف بعض الهياكل من حيث DSL أو بعض اللغات المخصصة ثم يكون لديك برنامج يقوم بإنشاء تعليمات برمجية أخرى منها. شيء آخر، يجب أن تكون حذرًا مع التعليمات البرمجية التي يتم إنشاؤها آليًا، لذلك لدينا أمثلة حيث تصف بعض الهياكل في DSL أو لغة مخصصة ثم تطلب من البرنامج إنشاء تعليمات برمجية أخرى منها.
وإذا كانت هذه البرامج التي تم إنشاؤها تحتوي على الكثير من المؤشرات، فقد تصبح باهظة الثمن لأنه عندما تقوم بإنشاء التعليمات البرمجية الخاصة بك، يمكنك إنشاء هياكل كبيرة جدًا جدًا. إذا كانت هذه البرامج التي تم إنشاؤها تحتوي على الكثير من المؤشرات، فقد تصبح باهظة الثمن لأنه عندما تقوم بإنشاء تعليمات برمجية، يمكنك إنشاء هياكل كبيرة جدًا جدًا.
لقد رأينا حالات حيث يؤدي ذلك إلى ظهور ميغابايت وميغابايت من البيانات. لقد رأينا أن هذا يمكن أن يؤدي إلى ميغابايت من البيانات.
لكن الجانب الإيجابي هو أنه عادة ما يكون لديك قدر كبير من التحكم لأنه يمكنك فقط تغيير منشئ التعليمات البرمجية لاستخدام شيء ليس مؤشرات، على سبيل المثال الهياكل القائمة على الإزاحة. لكن الفائدة هي أنه عادة ما يكون لديك قدر كبير من التحكم، حيث يمكنك تغيير منشئ التعليمات البرمجية لاستخدام شيء ليس مؤشرًا، مثل البنية القائمة على الإزاحة.
وسيكون ذلك فوزا كبيرا. وسيكون هذا انتصارا كبيرا.
لذلك في هذه الحالة، دعونا ننظر إلى ما يحدث هنا معي، مع وقت التحميل الخاص بي. في هذه الحالة، دعونا نلقي نظرة على ما يحدث هنا، وقت التحميل.
ولدي ما لا يقل عن 10000 فصل، ولدي في الواقع 20000 فصل، وقد تم تمرير الكثير منها خارج الشريحة. لدي ما لا يقل عن 10000 دورة تدريبية، ولدي في الواقع 20000 دورة تدريبية، الكثير منها تم عرضه للتو على الشرائح.
وإذا قمت بتقليصه إلى 1000 فصل، سأقوم فقط بتقليص أوقات الإطلاق، وقتي في هذا الجزء من الإطلاق من 350 إلى 20 مللي ثانية. إذا قمت بتقليلها إلى 1000 فصل، فإنني أقوم بتقليل وقت بدء التشغيل، وسأنتقل من 350 مللي ثانية إلى 20 مللي ثانية لهذا الجزء.
لذا، الآن، كل شيء ما عدا المُهيئ هو في الواقع أقل من علامة 400 مللي ثانية، لذلك نحن نقوم بعمل جيد جدًا. الآن، باستثناء المُهيئ، كل شيء آخر أقل من 400 مللي ثانية ونحن نقوم بعمل رائع.
لذا، بالنسبة لإعداد ObjC، ذكر نيك كل ما يتعين عليه القيام به. من أجل إنشاء ObjC، ذكر نيك كل ما كان عليه القيام به.
كان عليه أن يقوم بتسجيل الفئة، وعليه أن يتعامل مع ivars غير الهشة، وعليه أن يقوم بتسجيل الفئة، وعليه أن يقوم بـ uniqing المحدد. يجب أن تقوم بتسجيل الفصل، ويجب أن تتعامل مع ivars غير القابلة للتفتيت، ويجب أن تقوم بتسجيل الفصل، ويجب أن تقوم بتفرد المحدد.
ولن أقضي الكثير من الوقت في هذا الأمر على الإطلاق، والسبب في أنني لست كذلك هو أننا قمنا بحل كل هذه المشكلات عن طريق إصلاح عملية إعادة التأسيس والبيانات والربط من قبل. لن أقضي الكثير من الوقت في هذا، والسبب في أنني لن أقضي الكثير من الوقت في هذا هو أننا قمنا بحل كل هذه المشكلات عن طريق إعادة إنشاء القاعدة والبيانات، بالإضافة إلى الارتباطات السابقة.
جميع التخفيضات هناك ستكون نفس الشيء الذي تريد القيام به هنا. جميع التخفيضات هنا هي نفسها.
لذلك حصلنا على القليل من الفوز المجاني هنا، إنه صغير. لقد حصلنا على فوز مجاني صغير هنا، إنه صغير.
إنها 8 مللي ثانية. هذا هو 8 مللي ثانية.
لكننا لم نفعل أي شيء واضح لذلك. لكننا لم نفعل أي شيء واضح.
والآن أخيرًا، سنلقي نظرة على أدوات التهيئة الخاصة بي والتي تمثل الـ 10 ثوانٍ الكبيرة هنا. أخيرًا، نأتي إلى مُهيئاتي وهي أهم 10 ثوانٍ هنا.
لذلك سأتعمق في هذا الأمر أكثر مما فعل نيك. لذلك سأذهب إلى ما هو أعمق قليلاً من نيك.
هناك نوعان من المُهيئات، المُهيئات الصريحة، وأشياء مثل +load. هناك نوعان من المُهيئات، المُهيئات الصريحة مثل +load.
كما قال Nick، نوصي باستبدال ذلك بـ +initialize، مما سيؤدي إلى قيام وقت تشغيل ObjC بتهيئة التعليمات البرمجية الخاصة بك عندما يتم إثبات الفئات بدلاً من تحميل الملف. كما قال Nick، نوصي باستبداله بـ +initialize، مما سيؤدي إلى تهيئة وقت تشغيل ObjC للتعليمة البرمجية عند تأكيد الفئة، وليس عند تحميل الملف.أو، في C/C++، هناك سمة يمكن وضعها على الوظائف والتي ستتسبب في إنشاء تلك المُهيئات كمُهيئات، لذلك يعد هذا مُهيئًا صريحًا، والذي من الأفضل ألا تستخدمه. بدلاً من ذلك، في C/C++، هناك سمة يمكنك وضعها على وظيفة من شأنها إنشاء تلك المُهيئات، وهي مُهيئ صريح ونأمل فقط ألا تستخدمه.
نحن نفضل استبدالها بمهيئات موقع الاتصال. نفضل أن تستبدلها بمهيئات موقع الاتصال.
لذلك أعني من خلال مُهيئات موقع الاتصال أشياء مثل الإرسال مرة واحدة. من خلال استدعاء مُهيئ الموقع، أعني شيئًا مثل إرساله مرة واحدة.
أو إذا كنت تستخدم التعليمات البرمجية عبر الأنظمة الأساسية، فاستخدم pthread مرة واحدة. وبدلاً من ذلك، إذا كنت تستخدم تعليمات برمجية مشتركة بين الأنظمة الأساسية، فاستخدم pthread مرة واحدة.
أو إذا كنت تستخدم كود C++، فافعل ذلك مرة واحدة. أو إذا كنت في كود C++، ستد مرة واحدة.
كل هذه الوظائف لها نفس النوع من الوظائف حيث سيتم تنفيذ أي تعليمات برمجية في إحدى هذه الكتل في المرة الأولى التي يتم فيها تشغيلها، وهذا فقط. كل هذه الوظائف لها نفس الوظيفة بشكل أساسي، سيتم تنفيذ أي تعليمات برمجية داخل الكتلة عند الضربة الأولى وهذا كل شيء.
تم تحسين الإرسال مرة واحدة جدًا في نظامنا. تم تحسين الجدولة مرة واحدة جدًا في نظامنا.
بعد التنفيذ الأول لها، فهي في الأساس تعادل عملية no op التي يتم تشغيلها بعد ذلك، لذا أوصي بشدة باستخدام مُهيئات صريحة بدلاً من استخدامها. بعد التنفيذ الأول، يكون ذلك مكافئًا بشكل أساسي لعملية no op التي يتم تشغيلها فوقها، لذلك أوصي بشدة بعدم استخدام أدوات التهيئة الصريحة.
لذلك دعونا ننتقل إلى المُهيئات الضمنية. دعنا نواصل الحديث عن المُهيئات الضمنية.
لذا فإن المُهيئات الضمنية هي ما وصفه نيك في الغالب من عوالم C++ مع مُهيئات غير تافهة، مع مُنشئات غير تافهة. لذلك، تم وصف مُهيئات التطبيق بواسطة Nick في المتغيرات العامة لـ c++، والتي تتضمن مُهيئات غير تافهة ومُنشئات غير تافهة.
وأحد الخيارات هو أنه يمكنك استبدال تلك بمهيئات موقع الاتصال كما ذكرنا للتو. أحد الخيارات هو أنه يمكنك استبدالها بمهيئات موقع الاتصال التي ذكرناها للتو.
هناك بالتأكيد أماكن يمكنك من خلالها وضع العناصر العالمية ذات الهياكل أو المؤشرات غير العامة للكائنات التي ستقوم بتهيئتها. بالطبع يمكنك وضع المتغيرات العامة ذات الهياكل غير العامة في مكان ما، أو مؤشرات إلى الكائنات المراد تهيئتها.
خيار آخر هو أنه ليس لديك مُهيئات غير تافهة. خيار آخر هو أنه ليس لديك مُهيئ غير تافه.
لذلك في C++ هناك مُهيئات تسمى POD وهي بيانات قديمة بسيطة. يوجد في لغة c++ مُهيئ يسمى POD وهو عبارة عن بيانات قديمة عادية.
وإذا كانت كائناتك مجرد بيانات قديمة عادية، فسيقوم الرابط الثابت أو الثابت بحساب جميع البيانات الخاصة بقسم البيانات مسبقًا، ووضعها على أنها مجرد بيانات تظهر هناك، ولا يلزم تشغيلها، ولا يلزم إصلاحها. إذا كانت كائناتك مجرد بيانات قديمة عادية أو ثابتة أو ثابتة، فسيقوم الرابط بحساب جميع البيانات الموجودة في قسم البيانات مسبقًا، مثل البيانات التي تراها هنا، فلا يلزم تشغيلها ولا تحتاج إلى إصلاحها.
أخيرًا، قد يكون من الصعب حقًا العثور على هذه العناصر، لأنها ضمنية، ولكن لدينا تحذير في المترجم -Wglobal-constructors وإذا قمت بذلك فسوف يعطيك تحذيرات عندما تقوم بإنشاء أحد هذه التحذيرات. أخيرًا، من الصعب العثور على هذه العناصر لأنها ضمنية، ولكن لدينا تحذير في المنشئ compiler-wglobal-constructor الذي سيعطيك تحذيرًا إذا قمت بإنشاء واحد منها.
لذلك من الجيد إضافة ذلك إلى العلامات التي يستخدمها المترجم الخاص بك. لذا من الأفضل إضافتها إلى العلامات التي يستخدمها المترجم.
خيار آخر هو مجرد إعادة كتابتها في Swift. خيار آخر هو إعادة كتابتها بسرعة.
والسبب هو أن Swift يحتوي على متغيرات عامة وستتم تهيئتها، ومن المؤكد أنها ستتم تهيئتها قبل استخدامها. والسبب هو أن Swift يحتوي على متغيرات عامة تمت تهيئتها، ومن المؤكد أنها ستتم تهيئتها قبل استخدامها.
لكن الطريقة التي يفعل بها ذلك، بدلاً من استخدام مُهيئ، هو، خلف الكواليس، يستخدم الإرسال مرة واحدة لك. لكن طريقة تنفيذه هي أنه، خلف الكواليس، بدلاً من استخدام مُهيئ، يستخدم إرسالًا لك.
ويستخدم أحد مُهيئات موقع الاتصال تلك. يستخدم أحد مُهيئات موقع الاتصال.
لذا فإن الانتقال إلى Swift سيهتم بهذا الأمر نيابةً عنك، لذلك أشجعه بشدة على أن يكون هذا خيارًا. لذا فإن الانتقال إلى Swift سيساعدك على حل هذه المشكلة، لذا أشجعك بشدة على القيام بذلك كخيار.
أخيرًا، في أدوات التهيئة الخاصة بك، يرجى عدم الاتصال بـ dlopen، حيث سيكون ذلك بمثابة أداء كبير لمجموعة من الأسباب. أخيرًا، في مُهيئك، لا تستدعي dlopen، سيكون هذا أداءً كبيرًا لأسباب عديدة.
عندما يتم تشغيل dyld، يكون ذلك قبل بدء تشغيل التطبيق، ويمكننا القيام بأشياء مثل إيقاف القفل، لأننا ذوو خيط واحد. عندما يكون dyld قيد التشغيل، فإنه لم يبدأ بعد، يمكننا إيقاف تشغيل القفل لأننا ذوو خيط واحد.
بمجرد حدوث dlopens، في تلك المواقف، يتغير الرسم البياني لكيفية تشغيل أدوات التهيئة لدينا، ويمكن أن يكون لدينا عدة سلاسل رسائل، وعلينا تشغيل القفل، وستكون هناك فوضى كبيرة في الأداء. بمجرد حدوث dlopen، في هذه الحالات، كيف يقوم المُهيئ بتشغيل الرسم البياني الذي تم تغييره، قد يكون لدينا خيوط متعددة وعلينا فتح القفل، الأمر الذي سيكون بمثابة فوضى كبيرة في الأداء.
يمكنك أيضًا أن تواجه طريقًا مسدودًا خفيًا وسلوكيات غير محددة. يمكن أن يكون لديك أيضًا مآزق خفية وسلوك غير محدد.
أيضًا، من فضلك لا تبدأ سلاسل المحادثات في أدوات التهيئة الخاصة بك، لنفس السبب بشكل أساسي. أيضًا، من فضلك لا تبدأ المواضيع في أدوات التهيئة، لنفس السبب بشكل أساسي.
يمكنك إعداد نص كتم الصوت إذا كان عليك ذلك، كما أن النص الصامت يحتوي على قيم ثابتة محددة مسبقًا يمكنك إعدادها بدون تشغيل أي تعليمات برمجية. يمكنك تعيين نص صامت إذا لزم الأمر، نص صامت، وهناك نص صامت مفضل، وقيم ثابتة محددة مسبقًا يمكنك تعيينها دون تشغيل التعليمات البرمجية.لكن في الواقع، قد يمثل بدء سلسلة محادثات في أداة التهيئة مشكلة كبيرة في الأداء والصحة. ولكن في الواقع، يعد بدء مؤشر ترابط في أداة التهيئة مشكلة محتملة في الأداء والصحة.
لدينا هنا بعض التعليمات البرمجية، ولدي فئة C++ مع مُهيئ غير تافه. لدينا هنا بعض التعليمات البرمجية، ولدي فئة c++ التي تحتوي على مُهيئ مهم.
أواجه مشكلة في الاتصال. هناك مشكلة في اتصالي.
الرجاء المحاولة مرة أخرى في لحظة. يرجى المحاولة مرة أخرى في وقت لاحق.
حسنا، شكرا لك سيري. شكرا لك سيري.
أواجه، لدي مُهيئ غير تافه. لدي مُهيئ غير تافه.
وأعتقد أنني قمت بذلك لتصحيح جميع التعليقات التي تم التعليق عليها وحسنًا، لقد وصل إجمالي الوقت إلى 50 مللي ثانية. أعتقد أنني قمت بتصحيح كل ما تم التعليق عليه وهو إجمالي 50 مللي ثانية فقط.
لدي متسع من الوقت لتهيئة حبيباتي والقيام بكل شيء آخر، نحن في حالة جيدة جدًا. كان لدي الوقت الكافي لتهيئة السن والقيام بأشياء أخرى وكنا في حالة جيدة جدًا.
والآن بعد أن مررنا بذلك، دعونا نتحدث عما يجب أن نعرفه، إذا كان هذا طويلًا جدًا ومكثفًا جدًا. الآن بعد أن تناولنا ذلك، دعنا نتحدث عما يجب أن نعرفه إذا كنت فقط، هذا طويل جدًا وكثيف.
الأول هو الرجاء استخدام إحصائيات طباعة dyld لقياس أوقاتك وإضافتها إلى أدائك أو مجموعات العدوان الخاصة بك. الأول هو الرجاء استخدام dyld لطباعة الإحصائيات لقياس أوقاتك، وإضافتها إلى أدائك أو مجموعة الهجوم.
لذا يمكنك تتبع كيفية أداء تطبيقك بمرور الوقت، لذلك أثناء قيامك بنشاط بشيء لا تجده بعد أشهر وتواجه مشكلة في تصحيح أخطائه. لذا، يمكنك تتبع أداء التطبيق الخاص بك بمرور الوقت، لذلك أثناء العمل بنشاط على شيء ما، فإنك تفقد مساره بعد أشهر ويصبح من الصعب تصحيح الأخطاء.
يمكنك تحسين وقت تشغيل التطبيق الخاص بك عن طريق تقليل عدد dylibs لديك، وتقليل كمية فئات ObjC لديك، والتخلص من أدوات التهيئة الثابتة الخاصة بك. يمكنك تحسين وقت بدء تشغيل التطبيق الخاص بك عن طريق تقليل عدد dylibs، وتقليل عدد فئات ObjC، وإزالة المُهيئات الثابتة.
ويمكنك التحسين بشكل عام باستخدام المزيد من لغة Swift لأنها تقوم بالأشياء الصحيحة. في كثير من الأحيان، يمكنك التحسين باستخدام سرعات أعلى لأن هذا هو الشيء الصحيح الذي ينبغي القيام به.
أخيرًا، لا يُنصح باستخدام dlopen، فهو يسبب مشكلات خفية في الأداء يصعب تشخيصها. وأخيرًا، لا يُنصح باستخدام dlopen لأنه يمكن أن يسبب مشكلات طفيفة في الأداء يصعب تشخيصها.
لمزيد من المعلومات، يمكنك رؤية عنوان URL على الشاشة. راجع عنوان URL الذي يظهر على الشاشة لمزيد من المعلومات.
هناك العديد من الجلسات ذات الصلة في وقت لاحق من الأسبوع، ومرة أخرى، هناك جلسة أداء التطبيق من عام 2012 والتي تدخل في الأجزاء الأخرى من إطلاق التطبيق، والتي نوصي بشدة بمشاهدتها، إذا كنت مهتمًا. ستكون هناك جلستان مرتبطتان في وقت لاحق من هذا الأسبوع، وستغطي جلسة أداء التطبيق لعام 2012 أجزاء أخرى من نشر التطبيق ويوصى بها بشدة إذا كنت مهتمًا بذلك.
شكرًا لحضوركم جميعًا، أتمنى لكم أسبوعًا رائعًا. شكرًا لكم جميعًا على حضوركم وأتمنى لكم أسبوعًا رائعًا.
What to read next
Want more posts about iOS?
Posts in the same category are usually the best next step for reading more on this topic.
View same categoryWant to keep following #iOS?
Tags are useful for related tools, specific problems, and similar troubleshooting notes.
View same tagWant to explore another direction?
If you are not sure what to read next, return to the homepage and start from categories, topics, or latest updates.
Back home