سؤال

أقوم بتحسين بعض أكواد Perl التي يتم تشغيلها بشكل متكرر (مرة واحدة يوميًا لكل ملف).

هل تؤدي التعليقات إلى إبطاء نصوص Perl؟تجاربي تميل نحو لا:

use Benchmark;
timethese(20000000, {
    'comments' => '$b=1;
# comment  ... (100 times)
', 'nocomments' => '$b=1;'});

يعطي قيمًا متطابقة إلى حد كبير (بصرف النظر عن الضوضاء).

Benchmark: timing 10000000 iterations of comments, nocomments...
  comments:  1 wallclock secs ( 0.53 usr +  0.00 sys =  0.53 CPU) @ 18832391.71/s (n=10000000)
nocomments:  0 wallclock secs ( 0.44 usr +  0.00 sys =  0.44 CPU) @ 22935779.82/s (n=10000000)

Benchmark: timing 20000000 iterations of comments, nocomments...
  comments:  0 wallclock secs ( 0.86 usr + -0.01 sys =  0.84 CPU) @ 23696682.46/s (n=20000000)
nocomments:  1 wallclock secs ( 0.90 usr +  0.00 sys =  0.90 CPU) @ 22099447.51/s (n=20000000)

أحصل على نتائج مماثلة إذا قمت بتشغيل إصدارات التعليقات وعدم التعليقات كنصوص Perl منفصلة.

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

هل كانت مفيدة؟

المحلول

وبيرل هي لغة فقط في الوقت المترجمة، بحيث التعليقات وPOD ليس لها أي تأثير على أداء وقت التشغيل.

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

في بلدي ماك بوك، برنامج بيرل مع 2 التصريحات و 1000 خطوط 70 تعليقا الطابع يأخذ نفس الوقت لتجميع واحدة مع خطوط 1000 من تعليقات فارغة واحدة مع البيانات المطبوعة فقط 2. تأكد من تشغيل كل مؤشر <م> مرتين للسماح نظام التشغيل الخاص بك إلى ذاكرة التخزين المؤقت الملف، وإلا ما كنت القياس هو الوقت المناسب لقراءة الملف من القرص.

إذا وقت بدء التشغيل مشكلة بالنسبة لك، انها ليست بسبب تصريحات وPOD.

نصائح أخرى

وأداء وقت التشغيل؟ لا.

وتوزيع وأداء lexing؟ نعم، بطبيعة الحال.

ومنذ بيرل يميل إلى تحليل ويكس على الطاير، ثم تعليق سيؤثر على "بدء التشغيل" الأداء.

وهل تؤثر عليه بصورة ملحوظة؟ غير مرجح.

وبيرل يجمع برنامج نصي ومن ثم تنفيذ ذلك. تعليقات تباطؤ طفيف في مرحلة التحويل البرمجي، ولكن لها تأثير صفر على مرحلة التشغيل.

وبيرل ليست لغة البرمجة النصية في نفس بمعنى أن النصوص قذيفة هي. المترجم لا يقرأ خط ملف سطرا. ويتم تنفيذ برنامج بيرل في مرحلتين أساسيتين: تجميع ووقت التشغيل [1]. خلال مرحلة تجميع وتحليل شفرة المصدر وتحويلها إلى بايت كود. خلال المرحلة وقت يتم تنفيذ بايت كود على جهاز ظاهري.

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

وإنك تستخدم Benchmark. هذا طيب! يجب عليك أن تبحث عن طرق لتحسين خوارزمية - الأمثل الصغير لا. قد يكون جمعة :: DProf مفيدة للعثور على أي بؤر التوتر. كنت على الاطلاق <م> لا ينبغي أن تجريد التصريحات في محاولة مضللة لجعل البرنامج بشكل أسرع. عليك فقط جعله غير قابل للدعم.


[1] وهذا ما يسمى عادة "في الوقت المناسب" تجميع. بيرل في الواقع عدة مراحل أخرى مثل INIT وEND التي لا يهم هنا.

المقصود هو:تحسين الاختناقات.القراءة في ملف تتكون من:

  • فتح الملف،
  • القراءة في محتوياته،
  • إغلاق الملف،
  • تحليل المحتويات.

من بين هذه الخطوات، القراءة هي الجزء الأسرع على الإطلاق (لست متأكدًا من الإغلاق، إنها مكالمة نظام، لكن ليس عليك الانتظار حتى تنتهي).وحتى لو كانت 10% من الأمر برمته (وهذا ليس كذلك على ما أعتقد)، فإن تقليلها بمقدار النصف يؤدي فقط إلى تحسين الأداء بنسبة 5%، على حساب فقدان التعليقات (وهو أمر سيء للغاية).بالنسبة للمحلل، فإن التخلص من السطر الذي يبدأ بـ # لا يعد تباطؤًا ملموسًا.وبعد ذلك اختفت التعليقات، فلا يمكن أن يكون هناك تباطؤ.

الآن، تخيل أنه يمكنك بالفعل تحسين جزء "القراءة في النص" بنسبة 5% من خلال تجريد جميع التعليقات (وهو تقدير متفائل حقًا، انظر أعلاه).ما حجم حصة "القراءة في النص" في استهلاك الوقت الإجمالي للنص؟يعتمد ذلك على مقدار ما تفعله، بالطبع، ولكن نظرًا لأن نصوص Perl عادةً ما تقرأ ملفًا واحدًا إضافيًا على الأقل، فهي 50٪ على الأكثر، ولكن نظرًا لأن نصوص Perl عادةً ما تفعل شيئًا أكثر، فإن التقدير الصادق سيخفض هذا إلى شيء في النطاق من 1%.لذلك، فإن تحسين الكفاءة المتوقع عن طريق تجريد كافة التعليقات هو في معظم (متفائل جدًا) 2.5%، ولكنه أقرب حقًا إلى 0.05%.ومن ثم، فإن تلك التي تعطي فيها أكثر من 1% تكون سريعة بالفعل لأنها لا تفعل شيئًا تقريبًا، لذا فأنت تقوم مرة أخرى بالتحسين عند النقطة الخاطئة.

وفي الختام، تحسين الاختناقات.

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

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

ومن بول Tomblins تعليق:

<اقتباس فقرة>   <اقتباس فقرة>     

ولا بيرل تفعل نوعا من تجميع على ذبابة؟ ربما التعليقات الحصول على تجاهل وقت مبكر؟ -

  

ونعم بيرل يفعل.

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

وأتوقع أن تعليق واحد لن يؤدي إلا إلى الحصول على تحليل مرة واحدة، وليس عدة مرات في الحلقة، لذلك أنا أشك في ذلك هو اختبار صالح.

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top