هل تعلم أن الأمر يتطلب حوالي 17000 تعليمة وحدة المعالجة المركزية لطباعة (“Hello”) في بايثون؟ وأن الأمر يتطلب حوالي 2 مليار منها لاستيراد Seaborn؟
كنت ألعب اليوم باستخدام perf_event_open، وهو نظام Linux الذي يتيح لك إعداد جميع أنواع مراقبة الأداء. إحدى الطرق للتفاعل مع النظام هي من خلال أداة perf CLI. ما المشكلة؟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | root@X:~# cat print.py print("Hello") root@X:~# perf stat -e instructions:u python3 ./print.py Hello Performance counter stats for 'python3 ./print.py': 45713378 instructions:u 0.030247842 seconds time elapsed 0.025787000 seconds user 0.004282000 seconds sys |
45,713,378 هو عدد التعليمات اللازمة لتهيئة بايثون وطباعة Hello وتفكيك الشيء بالكامل مرة أخرى. أريد المزيد من الدقة! أريد فقط قياس هذا السطر الواحد من التعليمات البرمجية.
ومن هنا جاءت هذه الأداة الصغيرة:
1 2 3 4 5 6 7 | from cirron import Collector with Collector() as c: print("Hello") print(c.counters) # Sample(instruction_count=17181, time_enabled_ns=92853) |
لماذا اريد هذا؟ الأساس مجرد فضول، لكن هذا لا يعني أنه لا يمكن أن يكون مفيدًا: لنفترض أنك تهتم حقًا بأداء foo الخاص بك وتريد الحصول على اختبار انحدار يفشل إذا أصبح أبطأ من حد معين. لذا، تقوم بضبطه على time.time()
، وتؤكد أنه أقل من حد معين و… تدرك أن صندوق CI الخاص بك يقوم بتشغيل عدد كبير من الاختبارات المتزامنة وأن التوقيت مزعج للغاية.
ليس (بالقدر الكافي) عدد التعليمات!

يوضح هذا الرسم البياني توزيع قياسات الوقت لنفس القطعة من التعليمات البرمجية باستخدام time.time()
وtime.perf_counter()
وعدد التعليمات المقاسة باستخدام Cirron، مع تعديل مقياسها لتتناسب مع قياس الوقت. لاحظ مدى دقة توزيع عدد التعليمات (لاحظ أيضًا أنه ليس ثابتًا تمامًا).
لا يعني هذا أن عدد التعليمات هو كل شيء. فقد تختلف توقيتات الساعة الحائطية بشكل كبير بين عدد التعليمات المتساوي، وما إلى ذلك. ومع ذلك، فهي أداة مفيدة إذا كنت على دراية بحدودها.
ليست هناك تعليقات:
إرسال تعليق