أرقام الكمون التي يجب أن يعرفها
كل مبرمج - جدول "التأخيرات التي يجب أن يعرفها كل مبرمج". أنه يحتوي على متوسط قيم الوقت لتنفيذ عمليات الكمبيوتر الأساسية في عام 2012. هناك عدة طرق عرض بديلة لهذا الجدول ، وهنا أحدها.
رابط لمصدر المخططولكن ما الفائدة لمطوري الأجهزة المحمولة من هذه المعلومات في عام 2019؟ يبدو أن لا ، ولكن
يعتقد ديمتري كوركين (
SClown ) من فريق Yandex.Navigator: "كيف سيكون شكل الطاولة لجهاز iPhone الحديث؟" ما الذي جاء منه ، في نسخة نصية منقحة لتقرير ديمتري على
AppsConf .
ما هذا؟
لماذا يجب أن يعرف المبرمجون هذه الأرقام؟ وهل هي ذات صلة لمطوري الأجهزة المحمولة؟ هناك مهمتان رئيسيتان يمكن حلهما بمساعدة هذه الأرقام.
فهم النطاق الزمني في الكمبيوتر
اتخاذ موقف بسيط - محادثة هاتفية. يمكننا بسهولة معرفة متى تكون هذه العملية سريعة ومتى تكون طويلة: بضع ثوانٍ سريعة للغاية ، بضع دقائق هي محادثة عادية ، وساعة أو أكثر طويلة جدًا. مع تحميل الصفحات ، يكون مشابهًا: في أقل من ثانية - بسرعة ، بضع ثوان - يمكن تحمله ، ودقيقة كارثة ، قد لا ينتظر المستخدم التنزيل.
ولكن ماذا عن العمليات مثل إضافة رقم إلى صفيف - "الإدخال السريع" الذي يحب الناس التحدث عنه في بعض الأحيان في المقابلات؟ كم يستغرق الهاتف الذكي؟ نانوثانية ، ميكروثانية أم ميلي ثانية؟ لقد قابلت عددًا قليلًا من الأشخاص الذين يمكن أن يقولوا إن جزءًا واحدًا من الألف من الثانية هو وقت طويل ، لكن في حالتنا هذا الأمر.
نسبة سرعة مكونات الكمبيوتر المختلفة
يمكن أن يختلف وقت تنفيذ العمليات على الأجهزة المختلفة بعشرات أو مئات المرات. على سبيل المثال ، يختلف وقت الوصول إلى الذاكرة الرئيسية 100 مرة عن الوصول إلى ذاكرة التخزين المؤقت L1. هذا فرق كبير ، ولكن ليس لانهائي. إذا كان لدينا معنى محدد لذلك ، فعند تحسين تطبيقاتنا يمكننا تقييم ما إذا كان سيكون هناك مكسب زمني أم لا.

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

أردت على الفور التحقق من كل ذلك وإظهاره لزملائي وتطبيقه كلما أمكن ذلك. قررت أن أبدأ بالأداة القياسية التي تقدمها Apple - XCTest with measureBlock. تم تنظيم الاختبار على النحو التالي: خصص صفيفًا ، واملأه بالأرقام و XOR'il وكرر الخوارزمية 10 مرات ، بالتأكيد. بعد ذلك ، نظرت إلى مقدار الوقت الذي يستغرقه عنصر واحد.
حجم العازلة | الوقت الإجمالي | وقت للجراحة |
50 كيلو بايت | 1.5 مللي ثانية | 30 ن |
500 كيلو بايت | 12 مللي ثانية | 24 ن |
5000 كيلو بايت | 85 مللي ثانية | 17 ن |
زاد حجم المخزن المؤقت 100 مرة ، ولم يزداد وقت العملية 100 مرة فقط ، ولكنه انخفض أيضًا مرتين تقريبًا.
أيها السادة ، أيها الضباط ، خذلونا؟بعد هذه النتيجة ، تسللت إلي شكوك كبيرة حول إمكانية رؤية هذه الأرقام في الحياة الواقعية. قد لا يكون من الممكن لتطبيق منتظم أن تشعر بهذا الاختلاف. أو ربما على منصة المحمول كل شيء مختلف.
بدأت أبحث عن طريقة لمعرفة الفرق في الأداء بين ذاكرات التخزين المؤقت والذاكرة الرئيسية. خلال البحث ، صادفت مقالًا اشتكى فيه المؤلف من أن لديه معيارًا يعمل على نظامي Mac و iPhone ولم يُظهر هذه التأخيرات. أخذت هذه الأداة وحصلت على النتيجة - تمامًا كما في الصيدلية. زيادة وقت الوصول إلى الذاكرة بوضوح تام عندما تجاوز حجم المخزن المؤقت حجم ذاكرة التخزين المؤقت المقابلة.
ساعدني LMbench في الحصول على هذه النتائج. هذا معيار تم إنشاؤه بواسطة Larry McVoy ، أحد مطوري Linux kernel ، والذي يسمح لك بقياس وقت الوصول إلى الذاكرة ، وتكلفة تبديل سلاسل العمليات وعمليات نظام الملفات ، وحتى الوقت الذي تستغرقه عمليات المعالج الرئيسية: الجمع والطرح وما إلى ذلك. قدمت Texas Instruments
بيانات قياس
مثيرة للاهتمام لمعالجاتها. LMBench مكتوب بلغة C ، لذلك لم يكن من الصعب تشغيله على iOS.
تكاليف الذاكرة
مسلحًا باستخدام هذه الأداة الرائعة ، قررت إجراء قياسات مماثلة ، ولكن لجهاز محمول فعلي - لأجهزة iPhone. تم إجراء القياسات الرئيسية في نظام 5S ، ثم حصلت على النتائج عندما سقطت الأجهزة الأخرى في يدي. لذلك ، إذا لم يتم تحديد الجهاز ، فمن 5S.
وصول الذاكرة
في هذا الاختبار ، يتم استخدام صفيف خاص ، مليء بالعناصر التي تشير إلى بعضها البعض. كل عنصر من العناصر هو مؤشر لعنصر آخر. لا يتم تجاوز الصفيف بواسطة الفهرس ، ولكن بالانتقالات من عقدة إلى أخرى. هذه العناصر مبعثرة عبر الصفيف بحيث ، عند الوصول إلى عنصر جديد ، لم يكن في ذاكرة التخزين المؤقت ، ولكن تم إلغاء تحميله من ذاكرة الوصول العشوائي قدر الإمكان. يتداخل هذا الترتيب مع ذاكرات التخزين المؤقت قدر الإمكان.
لقد رأيت بالفعل النتيجة الأولية. في حالة ذاكرة التخزين المؤقت L1 ، يكون أقل من 10 نانوثانية ، أما L2 فهو بضع عشرات من النانوثانية ، وفي حالة الذاكرة الرئيسية ، يرتفع الوقت إلى مئات النانوثانية.

قراءة وكتابة السرعة
يتم قياس ثلاث عمليات رئيسية:
- قراءة ( p [i] + ) - نقرأ العناصر ونضيفها إلى المبلغ الإجمالي ؛
- record ( p [i] = 1 ) - يتم كتابة رقم ثابت في كل عنصر ؛
- القراءة والكتابة ( p [i] = p [i] * 2 ) - نخرج العنصر ونغيره ونكتب القيمة الجديدة.
عند العمل مع المخزن المؤقت ، يتم استخدام مقاربتين: في الحالة الأولى ، يتم استخدام كل عنصر رابع فقط ، وفي الحالة الثانية ، تكون جميع العناصر متسلسلة.

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

أثناء القراءة المتسلسلة ، يتمكن نظام التشغيل من تحميل البيانات اللازمة في ذاكرة التخزين المؤقت ، لذا لا يلزم الوصول إلى الذاكرة - لأي حجم مؤقت ، - يتم الحصول على جميع البيانات اللازمة من ذاكرة التخزين المؤقت. هذا ما يفسر لماذا لم أر فارق التوقيت في الاختبار الأساسي.
أظهرت نتائج قياسات عمليات القراءة والكتابة أنه في التطبيق العادي يكون من الصعب للغاية الحصول على تسارع يقدر بـ 100 مرة. فمن ناحية ، يقوم النظام نفسه بتخزين البيانات بشكل جيد ، وحتى مع الصفائف الكبيرة ، من المحتمل جدًا أن نجد بيانات في ذاكرة التخزين المؤقت. ومن ناحية أخرى ، فإن العمل مع مختلف المتغيرات يمكن أن يتطلب بسهولة الوصول إلى الذاكرة وفقدان المئات من النانو ثانية.
| L1 | L2 | الذاكرة |
أرقام الكمون | 1 ن | 7 نانوثانية | 100 ن |
5S فون | 7 نانوثانية | 30 ن | 240 ن |
iPhone 6s Plus | 5 نانوثانية | 12 ن | 200 ن |
iPhone X | 2 نانوثانية | 12 ن | 146 ن |
خيوط التكاليف
بعد ذلك ، أردت الحصول على بيانات مماثلة للعمل مع مؤشرات الترابط من أجل
فهم تكلفة استخدام تعدد مؤشرات ترابط : كم يكلف إنشاء مؤشر ترابط والتبديل من مؤشر ترابط إلى آخر. بالنسبة لنا ، هذه عمليات متكررة ، وأريد أن أفهم الخسارة.
الآلات. تتبع النظام
يساعد تتبع النظام كثيرًا على تتبع عمل الخيوط في التطبيق. تم وصف هذه الأداة بشيء من التفصيل في
WWDC 2016 . تساعد الأداة في رؤية التحولات حسب حالات الدفق وتقدم بيانات عن التدفقات في ثلاث فئات رئيسية: مكالمات النظام ، العمل مع حالات الذاكرة والدفق.

- مكالمات النظام يتم تقديمها في شكل "النقانق" الحمراء. عندما تشير إليهم ، يمكنك رؤية اسم طريقة النظام ومدة التنفيذ. غالبًا ما تحدث مكالمة النظام في تطبيقات التطبيقات بشكل مباشر: نستخدم شيئًا ، وهذا بدوره يستدعي بالفعل طريقة النظام. يجب ألا تعتمد على حقيقة أن الأساليب الموجودة في التعليمات البرمجية الخاصة بك ستكون مرئية.
- عمليات الذاكرة . يتم تقديمها في شكل "النقانق" الزرقاء. يتضمن ذلك عمليات مثل تخصيص الذاكرة والتحرير والتصفير وما إلى ذلك.
- حالة الدفق . اللون الأزرق - يتم تشغيل مؤشر ترابط ، ويقوم بعض المعالج بتنفيذ تعليمات برمجية من هذا الموضوع. الرمادي - يتم حظر الخيط لسبب ما ولا يمكن متابعة التنفيذ. أحمر - الخيط جاهز للعمل ، لكن في هذه اللحظة لا يوجد نواة مجانية لتنفيذ التعليمات البرمجية الخاصة به. اللون البرتقالي - تمت مقاطعة التدفق للعمل ذي الأولوية العليا.
- نقاط الاهتمام . هذه تسميات خاصة يمكن ترتيبها عن طريق الرمز عن طريق الاتصال بـ
kdebug_signpost
. يمكن أن تكون التسميات مفردة (مكان محدد في الكود) أو كنطاق (لتسليط الضوء على الإجراء بأكمله). باستخدام مثل هذه التسميات ، من الأسهل كثيرًا الربط بين مايكروثانية ومكالمات النظام مع التطبيق الخاص بك.
تكاليف إنشاء تيار
الاختبار الأول هو
تنفيذ مهمة في سلسلة رسائل جديدة . نقوم بإنشاء سلسلة رسائل بإجراءات معينة وننتظرها لإكمال عملها. بمقارنة إجمالي الوقت بوقت الإجراء نفسه ، نحصل على إجمالي الخسارة لبدء الإجراء في سلسلة رسائل جديدة.
في System Trace يمكنك أن ترى بوضوح كيف يحدث كل شيء:

- إنشاء تيار.
- الخيط الجديد الذي يعمل فيه الإجراء الخاص بنا. تقول المنطقة الحمراء في البداية أن الخيط تم إنشاؤه ، لكن لبعض الوقت لا يمكن تنفيذه ، لأنه لم يكن هناك نواة مجانية.
- الانتهاء من الدفق. ومن المثير للاهتمام أن إجراء إكمال مؤشر الترابط نفسه أكبر من إنشائه. على الرغم من أنه يبدو أن الحذف يكون دائمًا أسرع.
- في انتظار اكتمال الإجراء ، الذي كان في المخطط الأصلي ، وينتهي بعد انتهاء الدفق - تدرك الطريقة هذا لفترة ، وبعد ذلك ، التقارير. هذه المرة أطول بقليل من إكمال الدفق.
نتيجة لذلك ، يتطلب إنشاء الدفق تكاليف كبيرة: iPhone 5S - 230 microseconds ، 6S - 50 microseconds.
يستغرق إكمال الدفق وقتًا تقريبًا مرتين أكثر من الإنشاء ، كما تستغرق عملية الانضمام وقتًا ملموسًا. عند العمل مع الذاكرة ، حصلنا على المئات من النانوثانية ، وهو أقل بمقدار 100 مرة من عشرات المايكرو ثانية.
| النفقات العامة | خلق | النهاية | الانضمام |
5S فون | 230 μs | 40 μs | 70 μs | 30 μs |
iPhone 6s Plus | 50 ميكرون | 12 μs | 20 μs | 7 μs |
تحويل الوقت إشارة
الاختبار التالي هو
قياسات عمل الإشارة . لدينا موضوعان تم إنشاؤهما مسبقًا ، ولكل منهما إشارة قصيرة. تشير التدفقات بالتناوب إلى إشارة الجار وتنتظرها. تمرير الإشارات إلى بعضها البعض ، تلعب الجداول مجرى تنس الطاولة ، تعيد إحياء بعضها البعض. يعطي هذا التكرار المزدوج وقت التبديل المزدوج للإشارة.

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

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

في System Trace يمكنك أن ترى أن الكتل منتشرة بشكل عشوائي ، بعضها أطول من البقية. إذا أدى التبديل المتعدد إلى زيادة في وقت تنفيذ العملية ، فيجب أن يزيد متوسط وقت التنفيذ كنتيجة لذلك.
ومع ذلك ، مع زيادة عدد مؤشرات الترابط ، لا يزيد متوسط وقت التشغيل.من الناحية النظرية ، ينبغي الحفاظ على متوسط الوقت طالما أن الحمل يتوافق مع قوة المعالجة. وهذا يعني أن عدد المهام يتوافق مع عدد النوى.

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

في ما يلي جدول أرقام الكمون الخاص بنا مع بيانات حول التدفقات والإشارة.
| L1 | L2 | الذاكرة | إشارة |
أرقام الكمون | 1 ن | 7 نانوثانية | 100 ن | 25 ن |
5S فون | 7 نانوثانية | 30 ن | 240 ن | 8 μs |
iPhone 6s Plus | 5 نانوثانية | 12 ن | 200 ن | 5 μs |
iPhone X | 2 نانوثانية | 12 ن | 146 ن | 3.2 μs |
تكاليف الملف
لدينا بالفعل ذاكرة وخيوط - للتأكد من اكتمالها نحتاج فقط إلى عمليات نظام الملفات.
قراءة الملف
الاختبار الأول هو
قراءة السرعة - كم يكلف قراءة الملف. يتكون الاختبار من جزأين. في البداية ،
نقيس سرعة القراءة مع مراعاة فتح الملف وقراءته وإغلاقه. في الثانية ،
نفترض أن الملف مفتوح باستمرار : نحن نضع أنفسنا في مكان ما ونقرأ ما نريد.
يتم عرض النتائج بشكل صحيح من وجهة نظر اثنين.
عندما يكون الملف صغيراً ، يكون هناك القليل من الوقت لقراءة البيانات من الملف. ما يصل إلى كيلوبايت واحد هو 5.3 ميكروثانية - لا يهم: بايت واحد أو 2 أو 1 كيلوبايت - لكل 5.3 ميكرون. لذلك ، يمكنك التحدث عن السرعة فقط في حالة الملفات الكبيرة ، عندما يكون الوقت المحدد قد تم إهماله بالفعل. تستغرق عملية فتح الملف وإغلاقه في نفس الوقت تقريبًا لأي حجم ملف - في حالة 5S ، حوالي 50 ميكروثانية.

لسرعة القراءة ، يتم الحصول على هذه الرسوم البيانية.

بالنسبة إلى iPhone X وملف 1 ميجابايت ، يمكن أن تصل السرعة إلى 20 ميجابايت / ثانية. ومن المثير للاهتمام ، أن قراءة ملف 1 ميجا بايت أكثر كفاءة. مع أحجام الملفات الكبيرة ، يبدو أن أحجام ذاكرة التخزين المؤقت تتأثر. هذا هو السبب في انخفاض السرعة أكثر ويحدث في منطقة 10 ميغابايت.
إنشاء وحذف الملفات
يتكون الاختبار من خطوة
إنشاء ملف وكتابة البيانات وحذف الملفات التي تم إنشاؤها. والنتيجة تدريجي: في الأحجام الصغيرة ، يكون الوقت مستقرًا - حوالي 7 دقائق ، ويزيد من النمو. المقياس لوغاريتمي.

لقد فوجئت أن الوقت المستغرق لحذف ملف كبير يتناسب مع الوقت الذي استغرقته لإنشاء ، حيث افترضت أن الحذف هو عملية سريعة. اتضح لا ، بالنسبة إلى iPhone ، فإن الحذف في الوقت المناسب يشبه إنشاء ملف. الجدول الموجز يشبه هذا.
| L1 | L2 | الذاكرة | إشارة | القرص |
أرقام الكمون | 1 ن | 7 نانوثانية | 100 ن | 25 ن | 150 μs |
5S فون | 7 نانوثانية | 30 ن | 240 ن | 8 μs | 5 μs |
iPhone 6s Plus | 5 نانوثانية | 12 ن | 200 ن | 5 μs | 4 μs |
iPhone X | 2 نانوثانية | 12 ن | 146 ن | 3.2 μs | 1.3 μs |
الخاتمة
استنادًا إلى هذه القياسات ، لدينا الآن فكرة عن مقدار الوقت الذي تتطلبه عمليات iOS الأساسية: الوصول إلى الذاكرة هو nanoseconds ، والعمل مع الملفات هو microseconds ، وإنشاء دفق هو عشرات من microseconds ، والتبديل هو بضع ثوانٍ فقط.
للحصول على تعليق ملحوظ فعليًا في التطبيق ، يجب أن يتجاوز وقت تنفيذ الإجراء 15 مللي ثانية (الوقت المستغرق لتحديث الشاشة بسرعة 60 إطارًا في الثانية). هذا هو ما يقرب من ألف مرة أكبر من معظم القياسات التي اتخذت في المقال. في مثل هذا المقياس ، يكون عدد المللي ثانية كثيرًا ، والثاني "بالفعل إلى الأبد".
أظهرت الاختبارات أنه على الرغم من الفارق الكبير في وقت الوصول إلى الذاكرة وذاكرة التخزين المؤقت ، إلا أن استخدام هذه النسبة بشكل مباشر أمر صعب للغاية. قبل تجميع جميع البيانات الخاصة بك تحت L1 ، تحتاج إلى التأكد من أنها في الواقع سوف تعطي نتيجة.
وفقًا لاختبارات العمليات مع التدفقات ، تمكنا من التأكد من أن إنشاء التدفقات وتدميرها يتطلب وقتًا كبيرًا ، لكن أداء عدد كبير من العمليات الموازية لا يجلب تكاليف إضافية.
حسنًا ، في الختام ، أود أن أذكرك بالقاعدة الأكثر أهمية عند العمل على
قياسات الأداء -
أولاً ثم التحسين !
الملف الشخصي المتكلم ديمتري كوركين على
جيثب .
يتماشى تحويل تقارير AppsConf 2018 وتحويلها إلى مقالات بالتوازي مع التحضير لمؤتمر 2019 الجديد كليًا . لا يوجد سوى 7 مواضيع في قائمة التقارير المقبولة حتى الآن ، ولكن هذه القائمة ستتوسع طوال الوقت حتى يتم عقد مؤتمر رائع لمطوري الأجهزة المحمولة يومي 22 و 23 أبريل .
اتبع المنشورات ، والاشتراك في قناة يوتيوب والرسالة الإخبارية وهذه المرة سوف تطير بسرعة.