سؤال

أريد أن أعرف بالضبط ما هو تسلسل المكالمات الذي يحدث عندما يتم استدعاء getter/setter الذي تم إنشاؤه من خلال Class::MethodMaker؟

ما مدى تكلفة تعريف getter/setters بواسطة MethodMaker مقارنة بالأدوات الأصلية (التي يتم الكتابة فوقها في الوحدة)؟

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

المحلول

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

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

تحتاج حقًا إلى قضاء بضع دقائق للتفكير فيما تحتاجه حقًا.إذا كنت تريد إنشاء طرق وصول بسيطة تلقائيًا ولكنك تريد كتابة أي شيء أكثر تعقيدًا يدويًا، فربما تنظر إلى Class::Accessor::Fast.أو، إذا كنت تريد أسرع طرق الوصول الممكنة، فتحقق من Class::XSAccessor، الذي تعمل طرقه البسيطة للغاية كرمز C/XS وهي أسرع مرتين تقريبًا من أسرع موصل Perl.(ملحوظة:لقد كتبت الوحدة الأخيرة، لذا تعاملوا مع هذا بحذر.)

تعليق آخر:إذا كنت ستستخدم مجموعة أدوات PAR/PAR::Packer لتعبئة التطبيق الخاص بك، فلاحظ أن الكمية الكبيرة من التعليمات البرمجية الخاصة بـ Class::MethodMaker تؤدي إلى ملف قابل للتنفيذ أكبر بكثير ووقت بدء أولي أبطأ.بالإضافة إلى ذلك، هناك عدم توافق معروف بين C::MethodMaker وPAR.ولكن يمكن اعتبار ذلك خطأ PAR.

نصائح أخرى

هذا هو بالضبط الغرض من أدوات تصحيح الأخطاء :)

الق نظرة على com.perldebug المستندات، وخاصة القسم الخاص بالتوصيف.

على وجه الخصوص، سيؤدي تشغيل البرنامج النصي الخاص بك باستخدام perl -dDProf filename.pl إلى إنشاء ملف tt.out والذي يمكن لأداة dprofpp (الموزعة مع Perl) إنتاج تقرير منه.

لقد استخدمت البرنامج النصي للاختبار البسيط التالي:

#!/usr/bin/perl

package Foo;
use strict;
use Class::MethodMaker [ scalar => ['bar'], new => ['new'] ];

package main;
use strict;

my $foo = new Foo;
$foo->bar('baz');
print $foo->bar . "\n";

تشغيله باستخدام perl -d:DProfmethodmakertest.pl ثم استخدام dprofpp على الإخراج أعطى:

[davidp@supernova:~/tmp]$ dprofpp tmon.out
Class::MethodMaker::scalar::scal0000 has 1 unstacked calls in outer
Class::MethodMaker::Engine::new has 1 unstacked calls in outer
AutoLoader::AUTOLOAD has -2 unstacked calls in outer
Total Elapsed Time =  0.08894 Seconds
  User+System Time =  0.07894 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 25.3   0.020  0.020      4   0.0050 0.0050  Class::MethodMaker::Constants::BEG
                                             IN
 25.3   0.020  0.029     12   0.0017 0.0025  Class::MethodMaker::Engine::BEGIN
 12.6   0.010  0.010      1   0.0100 0.0100  DynaLoader::dl_load_file
 12.6   0.010  0.010      2   0.0050 0.0050  AutoLoader::AUTOLOAD
 12.6   0.010  0.010     14   0.0007 0.0007  Class::MethodMaker::V1Compat::reph
                                             rase_prefix_option
 0.00   0.000  0.000      1   0.0000 0.0000  Class::MethodMaker::scalar::scal00
                                             00
 0.00   0.000  0.000      1   0.0000 0.0000  Class::MethodMaker::Engine::new
 0.00       - -0.000      1        -      -  DynaLoader::dl_undef_symbols
 0.00       - -0.000      1        -      -  Class::MethodMaker::bootstrap
 0.00       - -0.000      1        -      -  warnings::BEGIN
 0.00       - -0.000      1        -      -  warnings::unimport
 0.00       - -0.000      1        -      -  DynaLoader::dl_find_symbol
 0.00       - -0.000      1        -      -  DynaLoader::dl_install_xsub
 0.00       - -0.000      1        -      -  UNIVERSAL::VERSION
 0.00       - -0.000      1        -      -  Foo::new

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

السؤال الحقيقي هو:هل يهم؟

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

@ ليون تيمرمانز

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

بالإضافة إلى إجابتي السابقة، إذا كنت تريد أن ترى بالضبط ما يحدث تحت الغطاء بالتفصيل، فقم بتشغيل البرنامج النصي الخاص بك في مصحح الأخطاء مع تشغيل وضع التتبع (perl -d filename.pl، ثم قل "t" للتتبع، ثم "r" "لتشغيل البرنامج النصي؛توقع الكثير من المخرجات بالرغم من ذلك!).

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